[英]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.