【发布时间】:2021-08-21 00:20:51
【问题描述】:
我正在尝试使用 WM_COPYDATA IPC 方法发送 HWND。 到目前为止,当发送一个字符串 LPCTSTR 时它可以工作。
LPCTSTR str = L"Test";
COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(TCHAR) * wcslen(str);
cds.lpData = (PVOID)str;
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);
但是当使用 HWND 时,消息甚至没有到达......
COPYDATASTRUCT cds;
cds.dwData = 20;
cds.cbData = sizeof(HWND);
cds.lpData = (PVOID)targetWnd;
LRESULT l = SendMessage(myhWnd, WM_COPYDATA, (WPARAM)nullptr, (LPARAM)&cds);
PVOID 应该能够指向任何 afaik。
我的 HWND 都已设置,并且上述两种方法都返回 0 作为 LRESULT。 我该如何调试?还是有什么根本错误?
【问题讨论】:
-
除非您还要发送其他数据,否则
WM_COPYDATA发送 HWND 太过分了;您可以将其作为任何自定义消息的wParam或lParam参数发送。 -
我不知道任何其他类型的 IPC,除了 WM_COPYDATA 用于同步状态和一些变量等小事。如果有更好的方法我很想学习。@JonathanPotter
-
哦,WM_USER+x 的东西。好的。但为什么这是矫枉过正?不一样吗?
-
没有。发送自定义消息没有跨进程的系统封送内存(如
WM_COPYDATA)。SendMessage(target, MY_MESSAGE, 0, (LPARAM)hwnd)将简单地复制wParam和lParam值。虽然你不想要WM_USER消息。如果您想让消息成为公共 API 的一部分,请改用WM_APP消息或注册消息。 -
"到目前为止,当发送一个字符串 LPCTSTR 时它可以工作" - 实际上,它没有,因为您将
cds.cbData设置为错误的值。您需要将其设置为lstrlen(str) * sizeof(*str)而不是sizeof(LPCTSTR)。
标签: c++ c winapi ipc wm-copydata