簡體   English   中英

WM_COPYDATA無法正確傳送我的字串

[英]WM_COPYDATA won't deliver my string correctly

我嘗試使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM