【问题标题】:MFC - Passing char buffer with PostMessage From DLLMFC - 使用来自 DLL 的 PostMessage 传递字符缓冲区
【发布时间】: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


【解决方案1】:

让我对你的帖子感到紧张的是你有“多线程”标签。这让我对从不同线程分配和使用 CStrings 感到紧张。出于这个原因,如果是我,我会传递 BSTR,使用 SysAllocString 从发布消息的代码中分配字符串,并使用 SysFreeString 从接收消息的代码中释放字符串。我需要注意的是,我不知道 WinCE 是否支持这些 API。

【讨论】:

    【解决方案2】:

    感谢所有回复!

    在通过 PostMessage() 发送之前,我可以通过将 char * 转换为 (LPARAM) 来解决最初的问题。我能够使用以下代码访问数据:

    char * rx_string = (char *) lParam;
    

    然后我在尝试从主程序向代码发送消息时遇到了问题。我最终使用了共享内存和临界区来最终发回消息,这将有效,而不是一开始就尝试使用 PostMessage()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多