0

我在 C# 中有 2 个应用程序通过 Windows 消息 App1:向 App2 发送消息

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:接收来自 App1 的消息

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

问题: 用户名是俄语,当我在 App2 中收到它时,我得到问号“???????”,我认为这是字节数组编码中的问题,但我不知道如何解决

4

2 回答 2

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(',');
于 2013-03-19T10:03:01.873 回答
2

您的两个应用程序是否作为两个独立的进程运行?

如果是这样,那么您不能string直接发送,因为它将包含一些在其他进程的地址空间中无效的内部指针。您不知道 STRING 类包含什么 - 它是隐藏的。因此,它可能包含它们,而不是“肯定包含”。

(尽管在 C#/.Net 中它肯定包含)。

你已经开始了:你需要将该字符串的内容打包成一个原始字节数组,自己保证它只包含数据,没有指针,然后将原始数组发送到第二个进程。

您问题的核心是COPYDATA结构的错误 P/Invoke 定义。lpVoid不应该是类型,而string应该是类型byte[]or IntPtr。一旦您将其类型更改为byte[],编译器将立即显示 '=msg' 和 '.Split' 无效。

请注意,您当前的 SENDING 代码仅包含一个错误:您提供的“数据长度”是数组的长度(它是正确的),但它也传递了“msg”,而不是数组“sarr”。修复 lpVoid 类型后,只需将该字段设置为sarr.

然后,在接收端,您将需要获取 COPYDATA,从中获取 a lpVoid,将其用作 abyte[]并将其传递给Encoding.GetString()方法 - 类似于 zaitsman呈现的内容。

于 2013-03-19T10:19:11.953 回答