2013-03-19 88 views
0

我在C#2級的應用程序,其經由窗口消息 App1的說話:將消息發送到應用2如何在windowsmessages上發送俄羅斯和阿拉伯字符?

string msg=UserName+","+UserAge; 

byte[] sarr =System.Text.Encoding.Default.GetBytes(msg);// 

int len = sarr.Length; 

COPYDATASTRUCT cds; 

cds.dwData = (IntPtr)100; 

cds.lpData = msg; 

cds.cbData = len + 1; 

result = SendMessage(hWnd, WM_COPYDATA, wParam, ref cds); 

App2的:從應用1

接收消息
COPYDATASTRUCT sentPara = new COPYDATASTRUCT(); 
Type mytype = sentPara.GetType(); 
sentPara = (COPYDATASTRUCT)message.GetLParam(mytype); 
string[] parameters = sentPara.lpData.Split(','); 

問題: 的用戶名是在俄羅斯,當我收到它在App2我有問號「???????」,我認爲這是在字節數組的編碼,但我不怎麼解決它

+4

你沒有*做*任何與字節數組... – 2013-03-19 09:56:38

+0

沒有我發送它,因爲它。我也嘗試將默認值更改爲UTF8,但我沒有工作 – 2013-03-19 09:57:39

+0

看看你正在設置'lpData' - 你將它設置爲'msg',而不是'sarr'。您只使用字節數組來查找要設置的長度。 – 2013-03-19 09:59:13

回答

2

是你的運行作爲兩個獨立的過程兩個應用程序?

如果是這樣,那麼您不能直接發送string,因爲它將包含一些在其他進程的地址空間中無效的內部指針。你不知道STRING類包含什麼 - 它是隱藏的。因此,它可能包含它們,而不是「肯定包含」。

(雖然在C#/。淨它肯定包含)。

您已經啓動好:你需要該字符串的包裝內容到一個原始字節數組,保證自己它只包含數據和沒有指針,然後發送原始陣列到第二進程。

問題的核心是COPYDATA結構錯誤的P/Invoke定義。 lpVoid不應該是string類型,而應該是byte[]IntPtr類型。一旦將其類型更改爲byte[],編譯器將立即向您顯示'= msg'和'.Split'無效。

請注意您當前的SENDING代碼只包含一個錯誤:您提供的「數據長度」是數組長度(這是正確的),但它也傳遞'msg',而不是數組' SARR」。修復lpVoid類型後,只需將該字段設置爲sarr即可。

然後,在接收端,你將需要得到了CopyData,從它那裏得到一個lpVoid,把它作爲一個byte[]並將其傳遞給Encoding.GetString()方法 - 類似於什麼zaitsman呈現。

2

我一個行添加到第二代碼:

COPYDATASTRUCT sentPara = new COPYDATASTRUCT(); 
Type mytype = sentPara.GetType(); 
sentPara = (COPYDATASTRUCT)message.GetLParam(mytype); 
var parametersDecoded = System.Text.Encoding.Default.GetString(sentPara.lpData); 
string[] parameters = parametersDecoded.Split(','); 
+0

謝謝Zaitsman,但編碼應該是UTF8 – 2013-03-19 12:16:14

+1

Sara Saeed我只使用了Default,因爲這是您在應用#1中使用的。編碼必須在兩者之間進行匹配。如果你需要UTF8,用'System.Text.Encoding.UTF8.GetString()'替換'System.Text.Encoding.Default.GetString()'。 – zaitsman 2013-03-20 08:36:23