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.

3

Другие решения

Также, lpData является указателем на фактические данные, и cbData должен быть размер данных, но вы на самом деле устанавливаете размер указателя. Вместо этого установите длину строки (и, возможно, символ завершающего 0 тоже: strlen(lpszString)+1

0

По вопросам рекламы [email protected]