美文网首页
进程间通讯

进程间通讯

作者: 北风知我意 | 来源:发表于2018-08-24 19:23 被阅读12次

一、进程间通讯的方式进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。二、发送消息实现进程间通讯前准备下面的例子用到一个windows api 32函数[DllImport("User32.dll", EntryPoint = "SendMessage")]private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);要有此函数,需要添加using System.Runtime.InteropServices;命名空间此方法各个参数表示的意义wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。msg:指定被发送的消息类型。wP:消息内容。lP:指定附加的消息指定信息。用api参考手册查看SendMessage用法时,参考手册则提示SendMessage与PostMessage之间的区别:SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息,但是SendMessage() 函数发出消息后一直等到接收方的消息响应函数处理完之后才能返回,并能够得到返回值,在此期间发送方程序将被阻塞,SendMessage() 后面的语句不能被继续执行,即是说此方法是同步的。而PostMessage() 函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。三、发送消息实现进程间通讯具体步骤1.新建windows应用程序(1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication(2)在Form1上添加一个标签为textBox1的文本框,并为Form1添加KeyDown事件,当Form1接收到KewDown消息时,将接收到的数据显示在label1上。public Form1(){InitializeComponent();this.KeyDown+=new KeyEventHandler(Form1_KeyDown);}private void Form1_KeyDown(object sender, KeyEventArgs e){this.textBox1.Text = Convert.ToString(e.KeyValue);}(3)编译运行,生成ProcessCommunication.exe2.新建windows应用程序  (1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication1,并在Form1上添加一个按钮和一个文本框namespace ProcessCommunication1{public partial class Form1 : Form{public Form1(){InitializeComponent();}//Win32 API函数:[DllImport("User32.dll", EntryPoint = "SendMessage")]private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);private void button1_Click(object sender, EventArgs e){Process[] pros = Process.GetProcesses(); //获取本机所有进程for (int i = 0; i < pros.Length; i++){if (pros[i].ProcessName == "ProcessCommunication") //名称为ProcessCommunication的进程{IntPtr hWnd = pros[i].MainWindowHandle; //获取ProcessCommunication.exe主窗口句柄int data = Convert.ToInt32(this.textBox1.Text); //获取文本框数据SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息}} }}}3.启动ProcessCommunication.exe可执行文件,弹出Form1窗体称为接受消息窗体。启动ProcessCommunication1.exe可执行文件,在弹出的窗体中的文本框中输入任意数字,点击button1按钮,接受消息窗体textBox1即显示该数字。到此结束。

相关文章

  • Android Binder

    进程间通讯 1. 操作系统的进程间通讯 进程间通讯 根据名字描述就是进程之间的信息交换进程间的互斥和同步 由于交换...

  • 进程间通讯

    一、进程间通讯的方式进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和...

  • 进程间通讯

    进程间通讯原理 现代操作系统的运行模式都是在保护模式。进程运行在虚拟内存中,进程之间相互隔离,进程成为了操作系统分...

  • 进程间通讯

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道、FIFO、消息队列)同步(互斥量、...

  • 进程间通讯

    经典实现 1、文件共享 两个进程约定磁盘空间上的某个文件为信息交互的媒介,这种情况要注意不同进程间访问共享文件的同...

  • android进程间通讯(3)--使用socket

    android进程间通讯(3)–使用Socket 前言:本文记录android进程间通讯的另一种通讯方式–Sock...

  • 系统编程-------进程间通讯

    进程间通讯 pipe, 亲属间进程通讯, 参数: pipedfd :用于接收pipe函数创建的管道文件的读写...

  • Android进程间通讯(二)AIDL、Binder源码分析

    Android进程间通讯(一)Binder介绍及AIDL的具体使用Android进程间通讯(二)AIDL、Bind...

  • Android进程间通讯(一)Binder介绍及AIDL的具体使

    Android进程间通讯(一)Binder介绍及AIDL的具体使用Android进程间通讯(二)AIDL、Bind...

  • Andoird进程间通讯Binder相关内容

    android进程间通讯开发了一套Binder机制,用来进行进程间通讯; 进程间传输涉及序列化,需要区分java的...

网友评论

      本文标题:进程间通讯

      本文链接:https://www.haomeiwen.com/subject/ydpiiftx.html