我正在开发一个需要使用导入的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;
如何获取消息中的字符?
答案 0 :(得分:0)
您的代码中有两个错误。
您引用的文档明确指出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字符的指针。而是使用 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;