Windows进程间通讯(IPC)----WM_COPYDATA

WM_COPYDATA通讯思路

通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯。
只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessage发送WM_COPYDATA消息。因为系统必须管理用以传递数据的缓冲区的生命期,如果使用了PostMessage(),数据缓冲区会在接收方(线程)有机会处理该数据之前,就被系统清除和回收。所以应该使用SendMessage,这样就能在接收方处理数据之前使发送方处于阻塞状态,发送数据的缓冲区不会被清除或释放。

SendMessage(hWnd,            //目标进程窗口句柄
            WM_COPYDATA, 
            WPARAM,          //发送进程的窗口句柄(GetConsoleWindow()可以获得当前控制台窗口句柄)
            LPARAM)          //指向一个COPYDATASTRUCT结构

利用COPYDATASTRUCT结构传送需要通讯的信息,接收方通过处理WM_COPYDATA消息来获得此结构。

typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;//数据长度
    PVOID lpData;//存放通信数据的内存的地址
} COPYDATASTRUCT, *PCOPYDATASTRUCT;

WM_COPYDATA原理

WM_COPYDATA原理是通过回调函数KeUserModeCallback来调用接收方的窗口过程

原文地址:https://www.cnblogs.com/revercc/p/14344829.html