[英]MFC - Passing char buffer with PostMessage From DLL
我繼承了一個老式的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
}
讓我對你的帖子感到緊張的是你有“多線程”標簽。 讓我感到緊張的是CStrings被分配並從不同的線程中使用。 出於這個原因,如果是我,我將使用SysAllocString傳遞BSTR來從發布消息的代碼中分配字符串,並使用SysFreeString從接收消息的代碼中釋放字符串。 我的警告是,我不知道WinCE是否支持這些API。
感謝所有的回復!
在通過PostMessage()發送char *之前,我能夠通過將char *轉換為(LPARAM)來解決初始問題。 我能夠使用以下代碼訪問數據:
char * rx_string = (char *) lParam;
然后我嘗試從主程序發回代碼消息。 我最終使用共享內存和關鍵部分來結束發送消息,這本來是有效的,而不是首先嘗試使用PostMessage()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.