我尝试使用WM_COPYDATA将字符串从一个窗口发送到另一个窗口。我的接收窗口完美地收到了消息。除了我发送的字符串不保持完整。
以下是我在发送应用程序中的代码:
HWND wndsend = 0;
wndsend = FindWindowA(0, "Receiving window");
if(wndsend == 0)
{
printf("Couldn't find window.");
}
TCHAR* lpszString = (TCHAR*)"De string is ontvangen";
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(lpszString);
cds.lpData = (TCHAR*)lpszString;
SendMessage(wndsend, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
这是接收应用程序中的代码:
case WM_COPYDATA :
COPYDATASTRUCT* pcds;
pcds = (COPYDATASTRUCT*)lParam;
if (pcds->dwData == 1)
{
TCHAR *lpszString;
lpszString = (TCHAR *) (pcds->lpData);
MessageBox(0, lpszString, TEXT("clicked"), MB_OK | MB_ICONINFORMATION);
}
return 0;
现在发生的事情是被调用的消息框输出中文字母。
我的猜测是我没有正确转换它,或者我实际上并没有发送字符串而只是指向它的指针,这在接收器的窗口中提供了完全不同的数据。我不知道如何修复它。
答案 0 :(得分:3)
sizeof(lpszString)
是指针的大小,但您需要缓冲区的大小(以字节为单位)。你需要使用:
sizeof(TCHAR)*(_tcsclen(lpszString)+1)
读取字符串的代码应该注意不要通过读取提供给它的cbData
的值来读取缓冲区的末尾。
请记住sizeof
在编译时进行评估。当你使用它时,请将这个想法放在心上,如果你发现自己使用sizeof
的东西,你知道它是动态的,那就退后一步。
作为一个额外的,免费的建议,我建议您停止使用TCHAR
并选择一个字符集。我会推荐Unicode。因此,请使用wchar_t
代替TCHAR
。您已经在构建Unicode应用程序。
答案 1 :(得分:0)
此外,lpData
是指向实际数据的指针,cbData
应该是数据的大小,但实际上是设置指针的大小。将其设置为字符串的长度(也可能是终止0字符:strlen(lpszString)+1