我编写了一个程序,它使用MFC,因此使用WinMI函数,如PostMessage.它主要只是一个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位值的数组设置为全局变量,但我不想将它们全部保存在与内存相关的单独值中.只是传递价值将是这里的最佳解决方案.
你有什么猜测我能在这做什么吗?
使用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
:调用函数分配数据,接收函数删除数据(它也可以使用malloc
和free
)
//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
是好还是坏(据我所知)