进程间通信之初探

本文介绍了Windows环境下多种进程间通信(IPC)的方式,包括自定义消息、WM_COPYDATA、内存读写、内存映射、DLL通信等,并详细阐述了每种方法的具体实现步骤。
 

进程间通信:IPC(Inter-Process Communication)

低级通信:信号量和管程机制。其第一个缺点就是传送信息量小,效率低。第二个缺点就是编码复杂。

高级通信:共享缓冲区、管道、消息、邮槽,剪贴板

1、使用自定义消息

 在windows下WM_USER为0x400,如果自定义消息,可以在它上面加上一个值

另一种方式来注册消息,就是RegisterWindowsMessage,它的好处就是不必考虑消息标识的表示范围。

SendMessage(WM_MyMsg, NULL,(LPARAM)uMsg);

2、使用WM_COPYDATA

使用指定的结构来发送,接收消息数据

typedef struct tagCOPYDATASTRUCT{

DWORD dwData;//自定义数据

DWORD cbData;//数据大小

PVOID lpData;//指向数据的指针

}COPYDATASTRUCT;

COPYDATASTRUCT cpd;

cpd.dwData = 0;   cpd.cbData = length; cpd.lpData = Buffer;

SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);

 3.使用内存读写

WriteProcessMemory, ReadProcessMemory

在进程内存使用VirtualAllocEx通过进程句柄来分配一个空间,使用WriteProcessMemory将信息写入该进程的内存,然后利用消息,将这块内存的基址发送给目标进程,目标进程使用ReadProcessMemory来读取该进程的该块内存.

 4、使用内存映射 

通过CreateFileMapping 来 创建一段内存映射

如CreateFileMapping(0xFFFFFFFF, 0, PAGE_READWRITE, highsize,lowsize,Name);

LPSTR basepointer =  (LPSTR)MapViewOfFile(m_hMapObj, FILE_MAP_READ,0 ,0,0);

在另一个进程OpenFileMapping来打开该共享内存,MapViewOfFile来获取指针,读取之后使用UnmapViewOfFile释放映射,CloseHandle(hMapObj);并关闭句柄

 5、使用DLL通信

在dll中建立一个新段来共享数据

#pragma data_seg("MyShared") 

char m_str[256] ;

#pragma data_seg()

#pragma comment(linker,"/SECTION:MyShared,RWS")

 6、使用windows剪贴板

BOOL OpenClipboard();//打开剪贴板

BOOL CloseClipboard();//关闭剪贴板

BOOL EmptyClipboard();//清空剪贴板

HANDLE SetClipboardData();//按指定数据格式放置剪贴板数据,用之前必须使用OpenClipBoard函数

BOOL IsClipboardFormatAvailable(UNIT uFormat);

7、使用消息管道

服务程序:

CreateNamedPipe创建命名管道

CreateNamedPipe("////.//pipe//ssnp//",RIGHTS,BLOCK_MODE,PIPE_UNLIMITED_INSTANCES,128,128,NULL,NULL);

创建线程来监听管道

连接管道ConnectNamedPipe(pipe_handle,..);

ReadFile,WriteFile....读写内容

客户程序:

打开管道使用CreateFile

使用ReadFile WriteFile来读写内容

8、使用邮槽通信

CreateMailslot:创建邮槽

GetMailslotInfo//阻塞等待数据

ReadFile WriteFile收发数据

完全类似于管道机制

9、使用windows套接字通信

全地球人都知道怎么写,就不细说了

初始化winsock检查winsock版本

服务器端:

socket->bind->listen->accept....>read....>write...close

客户端

socket->connect....>write...>read....>close

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值