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

Другие вопросы по тегам