Получение wParam из сообщения, полученного из DLL - PullRequest
0 голосов
/ 13 ноября 2018

Я работаю над программой, которая должна работать с импортированной DLL.Я могу загрузить DLL и нормально выполнять функции внутри нее.

Проблема возникает, когда мне нужно извлечь данные, которые она отправила с Send/PostMessage.

В документации сказано:

MSG_PSKCHARRDY

Числовое значение: WM_USER + 1001 или 0x400 + 0x3E9 или 0x7E9 или 2025. Это сообщение отправляется из DLL в окно, дескриптор которого передается при вызове fnStartSoundCard.Он отправляется всякий раз, когда из приемника доступен символ ASCII, или если в режиме передачи, когда символ был отправлен звуковой картой.

Следующие параметры отправляются вместе с этим сообщением:

  • wParam = Символ ASCII (от 0 до 255)

  • lParam = -1, если это переданный символ, или номер канала приема (0-49)отправляет сообщение.

Я добавил это как случай в моем WindProc как case: WM_USER + 1001:, и любой код внизу выполняется, когда вызывается функция fnStartSoundCardЯ знаю, что он получает сообщение.

Но когда я пытаюсь напечатать wParam как строку символов, я всегда получаю исключение в конце моей функции DispatchMessage(&msg) здесь:

while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return (int)msg.wParam;

Возникло исключение 0x76524463 (ucrtbase.dll) в PSK31.exe:
0xC0000005: Место чтения нарушения доступа 0x0000004D.

Мой обработчик сообщений выглядит следующим образом:

case WM_USER + 1001:
    if (hWnd == GetActiveWindow()) {
        char textChar;
        SOMETHING = (char*)wParam;
        printf(SOMETHING);
        Sleep(1000);
    }
    break;

Как я могу извлечь символ из сообщения?

1 Ответ

0 голосов
/ 13 ноября 2018

В вашем коде есть две ошибки.

  • В цитируемой вами документации ясно сказано, что сообщение MSG_DATARDY определено как WM_USER+1000, но вместо этого вы используете WM_USER+1001.

  • В цитируемой вами документации ничего не говорится о том, что значения wParam и lParam сообщения являются указателями на строки, но вы пытаетесь обработать wParam так, как если бы оно былои это явно не так.Ваш код сбой при попытке чтения с адреса 0x0000004D, который является адресом памяти, зарезервированным ОС, поэтому wParam не может быть указателем на данные в доступной для приложения памяти.0x4D (77) - это небольшое число, которое, безусловно, достаточно мало, чтобы быть похожим на фактическое число частот, поэтому числовые значения wParam и lParam должны использоваться как есть, а не приводиться к указателям на строки.

Попробуйте вместо этого:

#define MSG_DATARDY (WM_USER + 1000)

case MSG_DATARDY:
    if (hWnd == GetActiveWindow()) {
        int freq = (int) wParam;
        int strength = (int) lParam;
        printf("RX frequency: %d Hz, signal strength: %d", freq, strength);
        Sleep(1000);
    }
    break;

ОБНОВЛЕНИЕ : вместо обновленной документации, которую вы цитировали, вы все еще делаетета же ошибка в отношении wParam.Это НЕ указатель на символ ASCII.Вместо этого это фактический символ, поэтому используйте значение как есть:

#define MSG_PSKCHARRDY (WM_USER + 1001)

case MSG_PSKCHARRDY:
    if (hWnd == GetActiveWindow()) {
        char textChar = (char) wParam;
        int channel = (int) lParam;
        if (channel == - 1) {
            printf("TX character: %c", textChar);
        }
        else {
            printf("RX channel: %d, character: %c, ", channel, textChar);
        }
        Sleep(1000);
    }
    break;
...