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

C WinAPI,发布/发送具有64位值的消息(wParam、lParam),c,windows,mfc,C,Windows,Mfc,我编写了一个程序,它使用MFC和WinAPI函数,比如PostMessage。它主要是一个窗口线程和一个网络客户端线程。 我创建了自己的消息,到目前为止效果很好。 稍微解释一下程序: 我编写了一个客户端,它通过网络获取消息,对它们进行解码,然后需要将消息发送到显示消息值的窗口。所有这些都适用于32位值。使用PostMessage函数肯定有点不正确,因为lParam和wParam通常是指针。但我不能只使用指针,因为我的客户端应用程序和窗口应用程序是两个不同的线程,客户端应用程序中的值会尽快被删除。

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

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


你猜我能在这里做什么

使用
DEVICE\u INFO\u DATETIME
作为
WPARAM
,将数据地址作为
LPARAM
传递。使用
SendMessage
会更安全,因为它将引用传递给堆栈数据

long long date = 123;
SendMessage(getWindowHandle(), WM_NEW_DATA, DEVICE_INFO_DATETIME, (LPARAM)&date);
此外,如果正确定义了
WM\u NEW\u DATA
,则
设备信息日期时间
不必是像
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(hwnd,WM_APP+3,DEVICE_INFO_DATETIME,1)程序将崩溃。接收方无法知道
lParam
是好是坏(据我所知)

可能的重复,您只需传递指针的所有权即可。工作线程分配,UI线程可以清理。别忘了检查PostMessage的返回值。如何传递所有权?你的意思是我可以在我的工作线程中分配一个64位的变量(例如malloc),通过PostMessage将指针传递给我的UI,然后在使用value free()之后再传递指针?我知道C++中有类似SmartPointers的东西,但是我用的是C语言环境,谢谢!这就解决了问题。我有两个问题。首先使用wParam,它是一个UInt,以某种方式将指针变成一个随机数,然后使用PostMessage,当指针指向的内存为空时,会导致处理消息。SendMessage现在可以正常工作并完成其工作。这正是我想要的。我不确定投票失败的原因。对日期戳使用内存分配似乎有些过分。我添加了另一种方法,使用
PostMessage
传递64位整数。是的,我也想知道下一票。第二个版本也是我的想法,但我也需要发送定义。奇怪的是:在本例中,date是一个局部变量。使用SendMessage会导致WinAPI立即处理此消息,并且只有在返回SendMessage调用方之后,并且只有在处理调用函数之后,date才会被销毁。PostMessage导致在任何时候只处理消息,并立即返回调用函数,因此调用函数可能会完成,并且日期会丢失。我做对了吗?
SendMessage
类似于调用常规函数。它将等待另一个函数完成。而
PostMessage
会立即返回,不等待其他函数。另一个函数可能会在调用方函数已经完成且
date
超出范围并被销毁后尝试使用
date
SendMessage
有自己的回退,在这里它可能会导致程序挂起(即使它是多线程的)。我为
PostMessage
和指针添加了另一种方法。但是只要不引起问题,
SendMessage
就足够了。
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (msg == WM_NEW_DATA2)
    {
        long long date = ((long long)wParam << 32) + lParam;
    }
}
//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
}