从DLL

时间:2018-11-13 06:39:18

标签: c++ post get message

我正在开发一个需要使用导入的DLL的程序。我可以加载DLL,并在其中执行功能。

当我需要提取通过Send/PostMessage发送的数据时出现问题。

文档说:

  

MSG_PSKCHARRDY

     

数值是WM_USER + 1001或0x400 + 0x3E9或0x7E9或2025。   该消息从DLL发送到调用fnStartSoundCard时传递其句柄的Window。只要接收器有可用的ASCII字符,或者在发送模式下从声卡中发送了字符,就会发送该消息。

     

以下参数与该消息一起发送:

     
      
  • wParam = ASCII字符(0到255)

  •   
  • lParam = -1,如果是发送的字符,或者是发送消息的接收通道号(0-49)。

  •   

我在WindProc中将这种情况添加为case: WM_USER + 1001:,并在调用fnStartSoundCard函数时执行了下面的任何代码,因此我知道它正在接收消息。

但是当我尝试将wParam打印为char字符串时,我总是在这里的DispatchMessage(&msg)函数末尾引发异常:

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

PSK31.exe中的0x76524463(ucrtbase.dll)引发异常:
  0xC0000005:访问冲突读取位置0x0000004D。

我的消息处理程序如下:

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

如何获取消息中的字符?

1 个答案:

答案 0 :(得分:0)

您的代码中有两个错误。

  • 您引用的文档明确指出MSG_DATARDY消息定义为WM_USER+1000,但您使用的是WM_USER+1001

  • 您引用的文档未提及消息的wParamlParam值(它们是指向字符串的指针),但是您试图将wParam当作是,显然不是。您的代码在尝试从地址0x0000004D读取时崩溃,该地址是操作系统保留的内存地址,因此wParam不能是指向应用程序可访问内存中数据的指针。 0x4D(77)是一个很小的数字,肯定足够小,看起来像实际的频率数字,因此wParamlParam的数值应原样使用,而不应转换为字符串指针。

尝试以下方法:

#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字符的指针。而是使用 actual 字符,因此请按原样使用值:

#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;