簡體   English   中英

MFC - 使用PostMessage從DLL傳遞char緩沖區

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM