我在c#中有两个通过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收到它时,我得到了问号“???????”,我认为它是字节数组编码的东西,但我不知道如何解决它
答案 0 :(得分: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(',');
答案 1 :(得分:2)
您的两个应用程序是作为两个独立的进程运行的吗?
如果是这样,那么你就不能直接发送string
,因为它将包含一些在其他进程的地址空间中无效的内部指针。你不知道STRING类包含什么 - 它是隐藏的。因此,它可能包含它们,而不是“肯定包含”。
(虽然在C#/ .Net中肯定包含)。
你已经开始了:你需要将该字符串的内容打包到一个原始字节数组中,保证它只包含数据而没有指针,然后将原始数组发送到第二个过程。
问题的核心是COPYDATA
结构的错误P / Invoke定义。 lpVoid
不应为string
类型,但应为byte[]
或IntPtr
类型。将类型更改为byte[]
后,编译器将立即显示'= msg'和'.Split'无效。
请注意,您当前的发送代码只包含一个错误:您提供的“数据长度”是数组的长度(它是正确的),但它也会传递'msg',不是阵列'sarr'。修复lpVoid类型后,只需将字段设置为sarr
。
然后,在RECEIVING方面,您需要获取COPYDATA,从中获取lpVoid
,将其用作byte[]
并将其传递给Encoding.GetString()
方法 - 类似于 zaitsman 的内容。