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;
Теперь, что происходит, так это то, что в вызываемом окне выводятся китайские буквы.
Я предполагаю, что я не преобразовал это правильно, или что я на самом деле не посылаю строку, а просто указатель на нее, которая дает совершенно разные данные в окне получателя. Я не знаю, как это исправить, хотя.
2 ответа
sizeof(lpszString)
это размер указателя, но вам нужен размер в байтах буфера. Вам необходимо использовать:
sizeof(TCHAR)*(_tcsclen(lpszString)+1)
Код, который читает строку, должен позаботиться о том, чтобы не считывать конец буфера, читая значение cbData
что поставляется к нему.
Помни что sizeof
оценивает во время компиляции. Держите эту мысль перед собой, когда вы используете ее, и если вы когда-либо используете sizeof
с чем-то, что вы знаете, чтобы быть динамичным, сделать шаг назад.
В качестве дополнительного, бесплатного совета я советую вам прекратить использование TCHAR
и выберите один набор символов. Я бы порекомендовал Unicode. Итак, используйте wchar_t
на месте TCHAR
, Вы уже создаете приложение Unicode.
Также, lpData
является указателем на фактические данные, и cbData
должен быть размер данных, но вы на самом деле устанавливаете размер указателя. Вместо этого задайте длину строки (и, возможно, также завершающий символ 0: strlen(lpszString)+1