2013-03-19 42 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