WinAPI,使用64位值发布/发送消息(wParam,lParam)

时间:2016-01-07 13:40:25

标签: c windows mfc

我编写了一个使用MFC的程序,因此编写了像PostMessage这样的WinAPI函数。它主要只是一个Window-thread和一个network-client-thread。 我创建了自己的消息,到目前为止工作正常。 稍微解释一下这个程序:
我写了一个客户端,它通过网络获取消息,对它们进行解码,然后需要将消息发送到窗口,该窗口显示消息的值。所有这些都有效 - 使用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位值的数组设置为全局变量,但我不想将它们全部保存在与内存相关的单独值中。只是传递价值将是这里的最佳解决方案。

你有什么猜测我能在这做什么吗?

1 个答案:

答案 0 :(得分:5)

使用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是好还是坏(据我所知)