C++ MFC-从DLL传递带有PostMessage的字符缓冲区
我继承了一个老式的MFC Windows CE程序,我不得不对它进行一些修改。作为这项工作的一部分,我必须在不同的部分之间传递额外的数据。我们有一个调用DLL的主程序。DLL启动一个充当TCP服务器的后台进程。当TCP服务器接收到数据时,我需要将其一直推回到主程序 经过一些研究,WINAPI PostMessage函数(参见图1)似乎是一个不错的选择。当Main启动DLL时,它会传入自己的HWND。生成的TCP服务器进程接收到它调用PostMessage的数据后,它使用(1)这个保存的HWND(2)一个消息ID,(3)wParam是接收数据的长度,(4)LPRAM是指向接收数据本身的指针。DLL线程调用程序和调用的主代码的伪代码如图2和图3所示 我看到的是,在我的RemoteControlTCPMsg函数中调用了该函数,长度是正确的,但我的字符串数据不正确——奇怪的、损坏的数据。我打包字符串数据的方式是从几个示例中混合和匹配的,但显然在翻译过程中丢失了一些东西 有人能提供一行或两行代码,当通过PostMessage从DLL线程传递到像我这样的主应用程序时,这些代码可以正确地保留一个字符缓冲区吗 非常感谢,我在这里有些不知所措。如有任何想法/见解,我们将不胜感激C++ MFC-从DLL传递带有PostMessage的字符缓冲区,c++,multithreading,dll,mfc,C++,Multithreading,Dll,Mfc,我继承了一个老式的MFC Windows CE程序,我不得不对它进行一些修改。作为这项工作的一部分,我必须在不同的部分之间传递额外的数据。我们有一个调用DLL的主程序。DLL启动一个充当TCP服务器的后台进程。当TCP服务器接收到数据时,我需要将其一直推回到主程序 经过一些研究,WINAPI PostMessage函数(参见图1)似乎是一个不错的选择。当Main启动DLL时,它会传入自己的HWND。生成的TCP服务器进程接收到它调用PostMessage的数据后,它使用(1)这个保存的HWND(
***图1:来自MSDN的PostMessage文档
BOOL WINAPI PostMessage(
_In_opt_ HWND hWnd,
_In_ UINT Msg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
()
***图2:DLL后台线程中调用代码的伪代码:
#define RC_COMMAND_BUFFER_SIZE = 256;
char m_Cmd[RC_COMMAND_BUFFER_SIZE];
int m_CmdLen = 0;
(事件发生时,将填充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
}
让我对你的帖子感到紧张的是你有“多线程”的标签。它让我对从不同线程分配和使用cstring感到紧张。因此,如果是我,我将使用SysAllocString传递BSTR以从发布消息的代码中分配字符串,并使用SysFreeString从接收消息的代码中释放字符串。我的警告是,我不知道WinCE是否支持这些API。感谢所有回复 在通过PostMessage()发送之前,我可以通过将char*强制转换为(LPARAM)来解决最初的问题。我可以使用以下代码访问数据:
char * rx_string = (char *) lParam;
然后,我遇到了一个问题,试图从主程序向代码发送消息。我最终使用了共享内存和关键部分来发送消息,而这本来可以代替最初尝试使用PostMessage()。您可以使用SendMessage而不是PostMessage(它不是直接发送数据,而是延迟发送数据)您尚未解决的一些可能问题:应该在消息处理程序中删除传递的CString*,而不是在消息发送方中删除。CString可以是char容器或wchar\t容器。因为您是从一个字符数组开始的,所以请尝试使用CStringA而不是CString,以确保您没有在处理程序中将字符数据视为wchar\t。
char * rx_string = (char *) lParam;