2012-12-20 80 views
0

我想從C#(Compact Frame)中的應用程序發送WindowsMessage到另一個在C++(MFC)中,他們都在PDA中。如何從C#發送Windows消息到C++(MFC)?

在接收器應用程序(MFC)中,我意識到我收到消息但我無法讀取字符串消息,它顯示了一個小方塊。

這是發件人(C#)的代碼

OpenNETCF.Win32.Win32Window.SendMessage(hwndVal, typeMsgVal, intValue, stringMessage); 

這是接收器(C++)

CString myStr = (CString) lParam; 
AfxMessageBox(myStr); 
的代碼

非常感謝提前!

+1

http://stackoverflow.com/questions/184777/passing-data-between-c-mfc-app-and-c-sharp – user1849534

+0

你是如何在接收器中接收消息的?請發佈接收器代碼以幫助解釋問題 – stamhaney

+0

我不知道OpenNETCF函數 - 是不是正確地將字符串編組爲正確,而不僅僅是發送指針/對象引用?您可能需要使用[WM_COPYDATA](http://stackoverflow.com/a/10619347/243245) – Rup

回答

0

C#字符串編碼爲Unicode,而默認CString行爲爲LPCTSTR。確保您的MFC應用程序使用MultiByte字符集編譯(使用_UNICODE指令或代表編譯器語句)。請參閱the MSDN

+0

這並不意味着您可以將LPCTSTR轉換爲CString對象! – Rup

+0

如果您使用ANSI字符集LPCTSTR被定義爲LPCSTR,它不支持unicode使用的多字節字符。您可以使用轉換或宏將消息的lParam轉換爲LPCSTR,但將LPCTSTR定義爲LPCWSTR(const wchar_t *)會更容易,因此應用程序會自動使用unicode。這也使您能夠輕鬆地將消息發送回託管應用程序。 – Carsten

0

更好的解決方案是創建一個C++/CLI dll並將消息發送到此dll,此dll將與MFC dll進行通信。好處是,在C++/CLI dll中,可以將System.String轉換爲CString並將此CString傳遞給MFC dll。

1

您的每個應用程序都有自己的計算機內存空間。通過發送變量「stringMessage」,你實際上發送了這個字符串的內存地址,這對其他應用程序是不可用的。

我不知道它是否適用於pda開發,但this article可能會有用。

如果您的資源有限,可以隨時發送字符串的字符。由於c#是Unicode,所以在C++ sice上使用它,可以使用wchar_t來處理lParam!

編輯:正如Rup提到的,如果您需要發送大字符串 或者您需要非常頻繁地發送消息,則應該使用WM_COPYDATA。

+1

+1,可能與['WM_COPYDATA'](http://stackoverflow.com/a/10619347/243245)。不過,我認爲一個接一個發送這些字符會帶來巨大的開銷!你會將每個字符包裝在一個消息結構中並將其轉儲到某個隊列中。 – Rup

+0

我同意WM_COPYDATA更快。另一方面,我已經實施了我的解決方案,卻沒有注意到任何減速。它必須取決於字符串的大小和消息的頻率以及所需的性能級別。 – Goldorak84