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

被折叠的 条评论
为什么被折叠?



