【发布时间】:2015-02-25 17:17:03
【问题描述】:
我继承了一个老式的 MFC Windows CE 程序,并且必须对其进行一些修改。作为其中的一部分,我必须在不同的部分之间传递额外的数据。我们拥有的是一个调用 DLL 的主程序。 DLL 启动充当 TCP 服务器的后台进程。当那个 TCP 服务器接收到数据时,我需要将它一直推送回主程序。
经过一些研究,似乎 WINAPI PostMessage 函数(见图 1)是可行的方法。当 Main 启动 DLL 时,它会传入自己的 HWND。生成的 TCP 服务器进程接收到数据后,它调用 PostMessage 并使用 (1) 这个保存的 HWND (2) 消息 ID,(3) wParam 是接收到的数据的长度,以及 (4) lParam 是指向接收到的数据的指针数据本身。 DLL 线程调用者的伪代码和被调用的主代码如下图 2 和图 3 所示。
我看到的是在我的 RemoteControlTCPMsg 函数中调用了该函数,并且长度是正确的,但是我的字符串数据不正确——奇怪的、损坏的数据。我打包字符串数据的方式是从几个例子中混合和匹配的,但显然在翻译中丢失了一些东西。
是否有人可以提供一两行代码,以便在通过 PostMessage 从 DLL 线程传递到主应用程序(例如我的应用程序)时正确保留字符缓冲区?
非常感谢,我有点不知所措了。感谢任何想法/见解。
*** 图 1:来自 MSDN 的 PostMessage 文档
BOOL WINAPI PostMessage(
_In_opt_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
(https://msdn.microsoft.com/en-us/library/windows/desktop/ms644944%28v=vs.85%29.aspx)
*** 图 2:DLL 后台线程中调用代码的伪代码:
#define RC_COMMAND_BUFFER_SIZE = 256;
char m_Cmd[RC_COMMAND_BUFFER_SIZE];
int m_CmdLen = 0;
(当事件发生时,m_Cmd 和 m_CmdLen 被填充,这被称为:)
PostMessage(m_hWnd, MSG_ID, m_CmdLen,(LPARAM)(new CString(m_Cmd, m_CmdLen)));
*** 图3:主码中的接收码代码:
int CWAMPropertySheet::RemoteControlTCPMsg(WPARAM wParam, LPARAM lParam)
{
int length = = (int)wParam;
CString * rx_string = (CString*) lParam;
// handler code for the received text data and length
}
【问题讨论】:
-
您可以使用 SendMessage 而不是 PostMessage(它不直接传递数据,而是延迟传递)
-
一些您尚未解决的可能问题:传递的 CString* 应该在消息处理程序中删除,而不是在消息发送方中。 CString 可以是 char 容器或 wchar_t 容器。由于您从 char 数组开始尝试使用 CStringA 而不是 CString,以确保您没有在处理程序中将 char 数据视为 wchar_t。
标签: c++ multithreading dll mfc