MFC - 使用PostMessage从DLL传递char缓冲区

时间:2015-02-25 17:17:04

标签: c++ multithreading dll mfc

我继承了一个老式的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函数中调用函数IS,并且长度是正确的,但我的字符串数据不正确 - 奇怪,损坏的数据。我打包字符串数据的方式是混合和匹配的几个例子,但显然在翻译中丢失了一些东西。

有人可以提供一行或两行代码,当通过PostMessage从DLL线程传递到我的主应用程序时,它会正确保留char缓冲区吗?

非常感谢,我在这里结束了我的智慧。任何想法/见解都表示赞赏。


***图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

}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

感谢所有回复!

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

char * rx_string = (char *) lParam;

然后我尝试从主程序发回代码消息。我最终使用共享内存和关键部分来结束发送消息,这本来是有效的,而不是首先尝试使用PostMessage()。