VC++中进程间相互通信的十一种方法

来源:互联网 发布:淘宝网信鸽 编辑:程序博客网 时间:2024/05/17 03:49

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

  一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方

  另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。

  为了能在两个进程之间进行通讯,由以下几种方法可供参考:

  1、剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持

  2、窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

  3、使用共享内存方式(Shared Memory)

  a.设定一块共享内存区域

HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)

  产生一个file-mapping核心对象

LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAcess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);

  得到共享内存的指针

  b.找出共享内存

  决定这块内存要以点对点(peer to peer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。

  还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用


HANDLE OpenFileMapping(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName);

  再调用MapViewOfFile(),取得共享内存的指针

  c.同步处理(Mutex)

  d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

CloseHandle()

  4、动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能

  其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。

  5、消息管道(Message Pipe)

  用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序访问一个平面文件一样读写数据。

  匿名管道(Anonymous Pipes)

  单向流动,并且只能够在同一电脑上的各个进程之间流动。

  命名管道(Named Pipes)

  双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 式,而使用ReadFile()只能读取该大小的倍数。

  可以被使用于I/O Completion Ports

  6、邮件槽(Mailslots)

  广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 WIN9X下只支持邮件槽客户

  7、Windows套接字(Windows Socket)

  它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 用程序之间可以互相通信。

  8、Internet通信 它让应用程序从Internet地址上载或下载文件

  9、RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。

  10、串行/并行通信(Serial/Parallel Communication)

  它允许应用程序通过串行或并行端口与其他的应用程序通信

  11、COM/DCOM通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口 函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。

 

转自:http://soft.yesky.com/257/2212757.shtml

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 文竹长得太高怎么办 桑叶牡l丹长虫怎么办 日本海棠开完花后枯萎了怎么办 长寿冠海棠烂根怎么办 夏季长寿冠海棠掉叶怎么办 竹节海棠有点烂根怎么办? 丽格海棠烂茎怎么办 长寿花徒长不开花怎么办 长寿花植株长了怎么办 丽格海棠不爱长怎么办 竹节海棠太高了怎么办 绿萝叶子发黄烂根怎么办 发财树叶子发黄烂根怎么办 君子兰烂根叶子发黄怎么办 四季海棠花叶子干了怎么办 海棠花叶子枯萎枝干发黑怎么办 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办 深水井底下花管进水量小怎么办 盆景对节白腊树叶尖干枯怎么办 四季海棠茎软了怎么办 玫瑰海棠烂根了怎么办 格丽海棠花腌了怎么办 养殖场不能雨污分流怎么办 药店买的药贵了怎么办 神经损伤小便少尿不出来怎么办 手指夹伤出血了怎么办 手指夹破流血了怎么办 喂了宝宝熊胆粉怎么办