开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 62342|回复: 48
收起左侧

[C#图文教程] c#易语言进程通信的正确姿势

[复制链接]
发表于 2019-5-22 08:39:33 | 显示全部楼层 |阅读模式   广东省揭阳市
本帖最后由 赵六 于 2019-5-22 08:45 编辑

完成效果如图 可以易语言跟c# 或者跟其它语言通信 如果 是多个进程需要通信 只需查找到句柄发送消息即可
QQ截图20190521174056.png

Windows 进程通信 一般有 :管道、邮件槽、剪切板、共享内存、消息、sockeet等。

管道
  
管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。

  匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。
  匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。

命名管道
  命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给 它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
  命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
 
邮件槽
(Mailslots)提 供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个邮件槽实现进程间的双向通信。
  通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
  邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。
剪贴板
  剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
  剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
共享内存
  Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
Sockets
Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机制进行编程。
  现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。

WM_COPYDATA消息(微软推荐我们用这个)
  WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处 理WM_COPY DATA消息,这样收发双方就实现了数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,它只能用于Windows平台的单机环境下。
好了 既然微软推荐我们用这种 哪我们就用这种吧 开始写代码

第一步 找到要发送的窗口句柄
[DllImport("User32.dll", EntryPoint = "FindWindow")]      
private static extern int FindWindow(string lpClassName, string lpWindowName);

FindWindow 根据该窗口的类名和窗口标题. 获取一个顶层窗口 这个函数不查找子窗口.在查找时不区分大小写
(由于c#的会二次编译所以 类名每次都不一样所以 这里我们查询就只根据标题来吧)

第二步发送消息
const int WM_COPYDATA = 0x004A;//当一个应用程序传递数据给另一个应用程序时发送此消息
[DllImport("User32.dll", EntryPoint = "SendMessage")]      
private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);定义要发送的消息结构


public struct COPYDATASTRUCT    {
           public IntPtr dwData;//32位的自定义数据   
        public int cbData;//文本长度           
[MarshalAs(UnmanagedType.LPStr)]//传递给非托管代码的时候可能是LPStr   LPWStr   BStr等等。你通过MarshalAs特性告诉.NET应该封送成什么类型。         
  public string lpData;      
}


a1.png

好了 至此我们的发送已经结束了 现在 我们来新建一个项目实现接收
也一样先定义我们的数据结构  


a2.png
然后 在窗体里 重写  DefWndProc 方法

至此 我们的进程通信 就完成啦!

完整代码如下 csharp进程通信.zip (601.05 KB, 下载次数: 110)

点评

实验证明,当接受方假死无响应时,发送方也会死掉   广东省深圳市  发表于 2022-3-10 02:26

评分

参与人数 5好评 +3 精币 +11 收起 理由
qq578800641 + 1 新技能已get√
qingshanlushui + 1 + 2 支持开源~!感谢分享
ww850832845 + 1 + 1 楼主贴份C#的接收端呗
kyo9766 + 2 新技能已get√
冰点 + 1 + 5 支持开源~!感谢分享

查看全部评分

签到天数: 4 天

发表于 2024-10-2 12:02:28 | 显示全部楼层   江西省赣州市
是提供了一种我所没见过的进程交互方法,但是我还是建议 socket 通杀 或者再简单一点 HTTP 我现在多进程就是这样做的,主程序除非更新不然都不带卡死或者闪退的.
回复 支持 反对

使用道具 举报

发表于 2024-8-11 14:59:50 | 显示全部楼层   福建省宁德市
666666666666666666
回复 支持 反对

使用道具 举报

发表于 2024-8-11 14:44:46 | 显示全部楼层   福建省宁德市
非常感谢的棒
回复 支持 反对

使用道具 举报

发表于 2024-8-11 02:49:34 | 显示全部楼层   福建省宁德市
非常非常非常棒
回复 支持 反对

使用道具 举报

发表于 2024-8-11 02:49:11 | 显示全部楼层   福建省宁德市
非常完美
回复 支持 反对

使用道具 举报

发表于 2024-8-5 17:34:32 | 显示全部楼层   黑龙江省哈尔滨市
我去去去去去去去去去去去去
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2024-7-30 20:59:34 | 显示全部楼层   广东省广州市
好东西,下载学习一下
回复 支持 反对

使用道具 举报

发表于 2023-12-8 22:04:45 | 显示全部楼层   山西省忻州市
学习AAAAAAAAAAAAAAAAAAAAAAAAAAA
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2023-12-5 18:37:08 | 显示全部楼层   江苏省苏州市
感谢楼主!
回复 支持 反对

使用道具 举报

发表于 2023-11-8 07:28:32 | 显示全部楼层   重庆市重庆市
2023年路过,下载学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表