一、MSDN提供:
#define WM_COPYDATA 0x004A
数据结构:
typedef struct tagCOPYDATASTRUCT { ULONG_PTR dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT, *PCOPYDATASTRUCT;dwData
Type: ULONG_PTR
The data to be passed to the receiving application.
Type: DWORD
The size, in bytes(此处我用红色标示,就是重要警告), of the data pointed to by the lpData member.
Type: PVOID
The 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 );
本文详细介绍了Windows消息WM_COPYDATA的使用,包括MSDN提供的官方说明,具体的使用步骤,以及在实现跨进程通信时需要注意的事项。

3007

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



