您的位置:首页 > 运维架构

跨进程通信之WM_COPYDATA

2016-04-22 14:07 423 查看

一、MSDN提供:

#define WM_COPYDATA                     0x004A
数据结构:
typedef struct tagCOPYDATASTRUCT {
ULONG_PTR dwData;
DWORD     cbData;
PVOID     lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
dwDataType: ULONG_PTRThe data to be passed to the receiving application.cbDataType: DWORDThe size, in bytes(此处我用红色标示,就是重要警告), of the data pointed to by the lpData member.lpDataType: PVOIDThe data to be passed to the receiving application. This member can be NULL.

二、使用方法:

操作系统对该消息做了特殊处理。1.只能使用SendMessage(不能使用PostMessage),阻塞,等待bool OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)执行后返回,故可以发送局部指针变量;2.::SendMessage(hWnd,WM_COPYDATA,NULL(该参数为发送端窗口句柄),(LPARAM)&dsSend(该参数为COPYDATASTRUCT*));

三、注意:

1.使用WCHAR*的时候,cbData不是WCHAR的个数,而是:sizeof(WCHAR)*(wcslen(str)+1)解析:宽字符串的字节长度+‘\0’;2.如果是发送结构体,成员变量是CString 或者LPWSTR等都是不合适的(除非自己计算sizeof),使用固定长度的char型数组,会使代码可读性,及效率上更好。3.该消息与Clipborad不同,不是共享内存的,可以通过比较发送端首地址、接收端首地址发现并不一样。只是跨进程做了一个内存拷贝。所以cbData的值一定不能小于其实际sizeof的值,否则,接收端接收到的指针解析不出来。而且MSDN中的事例:
// ************ Globals ************
//
#define MYDISPLAY 1
typedef struct tagMYREC
{
char  s1[80];
char  s2[80];
DWORD n;
} MYREC;
COPYDATASTRUCT MyCDS;
MYREC MyRec;
HRESULT hResult;
BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );
// ************ Code fragment ****************
// Get data from user. InfoDlgProc stores the information in MyRec.
//
DialogBox( ghInstance, "InfoDlg", hWnd, (DLGPROC) InfoDlgProc );
//
// Copy data into structure to be passed via WM_COPYDATA.
// Also, we assume that truncation of the data is acceptable.
//
hResult = StringCbCopy( MyRec.s1, sizeof(MyRec.s1), szFirstName );
if (hResult != S_OK)
return False;
hResult = StringCbCopy( MyRec.s2, sizeof(MyRec.s2), szLastName );
if (hResult != S_OK)
return False;
MyRec.n = nAge;
//
// Fill the COPYDATA structure
//
MyCDS.dwData = MYPRINT;          // function identifier
MyCDS.cbData = sizeof( MyRec );  // size of data
MyCDS.lpData = &MyRec;           // data structure
//
// Call function, passing data in &MyCDS
//
hwDispatch = FindWindow( "Disp32Class", "Hidden Window" );
if( hwDispatch != NULL )
SendMessage( hwDispatch,
WM_COPYDATA,
(WPARAM)(HWND) hWnd,
(LPARAM) (LPVOID) &MyCDS );
else
MessageBox( hWnd, "Can't send WM_COPYDATA", "MyApp", MB_OK );

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: