WM_COPYDATA无法正确传递我的字符串

WM_COPYDATA won't deliver my string correctly

本文关键字:我的 字符串 COPYDATA WM      更新时间:2023-10-16

我尝试使用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;

现在发生的是被称为输出中文字母的消息框。

我的猜测是我没有正确地转换它,或者我实际上没有发送字符串,而只是向其发送指针,这在接收器的窗口中提供了完全不同的数据。我不知道如何修复它。

sizeof(lpszString)是指针的大小,但是您需要缓冲区字节中的大小。您需要使用:

sizeof(TCHAR)*(_tcsclen(lpszString)+1)

读取字符串的代码应注意不要通过阅读提供给它的cbData的值来读取缓冲区的末尾。

请记住,sizeof在编译时评估。当您使用它时,请将这种想法保持在脑海中,如果您发现自己使用sizeof与您知道是动态的东西,请退后一步。

作为一个额外的免费,建议,我建议您停止使用TCHAR并选择一个字符集。我会推荐Unicode。因此,使用wchar_t代替TCHAR。您已经在构建一个Unicode应用程序。

另外,lpData是指向实际数据的指针,cbData应该是数据的大小,但实际上您正在设置指针的大小。将其设置为字符串的长度(也可能是终止0个字符:strlen(lpszString)+1