c - WinAPI,发布/发送具有 64 位值的消息(wParam、lParam)

标签 c windows mfc

我编写了一个使用 MFC 的程序,因此使用 WinAPI 函数,如 PostMessage。它主要只是一个窗口线程和一个网络客户端线程。 我创建了自己的 Message,到目前为止它运行良好。 稍微解释一下程序:
我编写了一个客户端,它通过网络获取消息,对其进行解码,然后需要将消息发送到显示消息值的窗口。所有这些都有效 - 使用 32 位值。这肯定是某种不正确使用 PostMessage 函数的原因,因为 lParam 和 wParam 通常是指针。但我不能只使用指针,因为我的客户端应用程序和我的 Window 应用程序是两个不同的线程,客户端应用程序中的值会尽快被删除。 (客户端需要调用服务端的循环请求)

#define DEVICE_INFO_DATETIME 70000
long long date;
date = (value->serverTimestamp);
PostMessage(getWindowHandle(), WM_NEW_DATA, date, DEVICE_INFO_DATETIME);

事情是我得到时间戳和其他编码为 64 位的数据。 wparam 和 lparam 只是 32 位,所以它总是截断我的值。好的,我可以用 64 位编译它,然后使用 64 位值,但这与 32 位系统不兼容(对吗?),这不是我想要的。这种代码的解决方法是设置一个临时的 64 位值或一个 64 位值的数组作为全局变量,但我不想将它们全部保存在与内存相关的单独值中。只传递值将是这里最好的解决方案。

你猜猜我能在这里做什么?

最佳答案

使用DEVICE_INFO_DATETIME作为WPARAM,将数据地址作为LPARAM传递。使用 SendMessage 会更安全,因为它传递对堆栈数据的引用。

long long date = 123;
SendMessage(getWindowHandle(), WM_NEW_DATA, DEVICE_INFO_DATETIME, (LPARAM)&date);

此外,如果 WM_NEW_DATA 定义正确,则 DEVICE_INFO_DATETIME 不必是像 70000 这样的大随机数。例如

#define WM_NEW_DATA WM_APP + 1
#define DEVICE_INFO_DATETIME 1


您还可以将 long long 值作为两个整数传递,这将适用于 PostMessage

#define WM_NEW_DATA2 WM_APP + 2

long long date = ...
int hi = date >> 32;
int lo = (int)date;
PostMessage(hwnd, WM_NEW_DATA2, (WPARAM)hi, (LPARAM)lo);

接收:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (msg == WM_NEW_DATA2)
    {
        long long date = ((long long)wParam << 32) + lParam;
    }
}



使用指针和PostMessage:调用函数分配数据,接收函数删除数据(也可以使用mallocfree)

//call:
long long *date = new long long;
PostMessage(hwnd, WM_APP + 3, DEVICE_INFO_DATETIME, (LPARAM)date);

//receive:
if (msg == WM_APP + 3)
{
    long long *date = (long long*)lParam;
    if (!date) return 0; //insufficient error check!
    delete date;//delete pointer when finished
}

但是这很容易出错。例如,如果调用者不小心发送了 PostMessage(hwnd, WM_APP + 3, DEVICE_INFO_DATETIME, 1); 程序就会崩溃。接收方无法知道 lParam 是好是坏(据我所知)

关于c - WinAPI,发布/发送具有 64 位值的消息(wParam、lParam),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34656613/

相关文章:

java - 将消息从 C++ 服务器发送到 Java 客户端

c++ - 带有控制台输出的 Qt GUI 应用程序 - 在 Windows 上正常启动时隐藏控制台

c++ - 将 MFC gui 添加到 Win32 C++ 命令行应用程序的好方法是什么?

c++ - 序列化具有不同成员的继承类 MFC c++

c++ - 在 Linux 中学习 C/C++/Assembly 我应该去哪个 Linux 发行版

c - 使用 scanf 的字符串读取问题

c - 如何从内核空间读取用户进程地址?

C++:有效地将 Sha256 摘要获取到 OpenSSL Bignum 中?

windows - Windows上的Iex如何清屏

c++ - wxwidgets 报错 WINDOWS.H already included