2014-01-27 28 views
2

我試圖用WM_COPYDATA從一個窗口發送到另一個字符串。我的接收窗口完全收到了訊息。除了我發送的字符串不會保持不變。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; 

現在發生的事情是被調用輸出中國的信件在MessageBox 。

我的猜測是,我並沒有轉換是正確的,或者說,我並沒有真正發送字符串,但只是指向它的指針,這給在接收機的窗口完全不同的數據。我不知道如何解決它。

+0

在這兩種情況下,您都使用'TCHAR'作爲數據類型。兩種應用程序的構建類型(ANSI/Unicode)一樣的嗎? – Jon

+1

(TCHAR *)是定義一個TCHAR文字錯誤的方式。使用_T(...)宏。 –

+0

@喬恩我打算用我的代碼在DLL中以後,可以通過兩種ANSI/Unicode的被稱爲這是我爲什麼選擇使用TCHAR的原因 –

回答

3

sizeof(lpszString)是指針的大小,但你需要在緩衝區的字節大小。您需要使用:

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

讀取該字符串應該注意不要通過讀取的是提供給它cbData值來讀出緩衝區末尾的代碼。

記住sizeof評估在編譯時。當你使用它的時候,將這種想法留在你的頭腦中,如果你發現自己使用了sizeof,那麼你知道這些東西是動態的,退後一步。

作爲一個額外的,免費的,忠告,我建議你停止使用TCHAR並挑選一個字符集。我會推薦Unicode。因此,請使用wchar_t代替TCHAR。您已經在構建一個Unicode應用程序。

0

另外,lpData是一個指向實際數據的指針,而cbData應該是數據的大小,但實際上是在設置指針的大小。將其設置爲字符串長度(也可能是終止0字符:strlen(lpszString)+1