Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MFC-从DLL传递带有PostMessage的字符缓冲区_C++_Multithreading_Dll_Mfc - Fatal编程技术网

C++ MFC-从DLL传递带有PostMessage的字符缓冲区

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(

我继承了一个老式的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线程传递到像我这样的主应用程序时,这些代码可以正确地保留一个字符缓冲区吗

非常感谢,我在这里有些不知所措。如有任何想法/见解,我们将不胜感激


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