300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > c#中使用消息循环机制发送接收字符串的方法和数据类型转换

c#中使用消息循环机制发送接收字符串的方法和数据类型转换

时间:2020-12-23 14:13:26

相关推荐

c#中使用消息循环机制发送接收字符串的方法和数据类型转换

在定义消息时忘记了用户可定义消息的边界值,在网上一阵疯找后来发现是const int WM_USER = 0x400。接着是SendMessage的lParam类型不能决定(默认是IntPtr),我想发送字符串信息,就将它定为了string型,然后通过重写DefWndProc接收自定义消息。问题出现:(string) message.lParam提示不能转换,然后使用另一种方法:(string)message.GetLParam(typeof(string)),依然有错,提示应该重载string的构造函数建立string的无参构造函数(够狠)。

后来在网上见到一篇文章“C#用WM_COPYDATA消息来实现两个进程之间传递数据”,经提示想到一方法:用结构体封装string字段,然后传结构体就可以了(结构体有自己的无参构造函数--其实原本想自己写个无参构造函数,却发现在vs下无法编译通过,提示不能够创建结构体的无参构造函数)。这样就可以在DefWndProc中通过(tagStructStr)message.GetLParam(typeof(tagStructStr))将LParam转换为结构体类型,然后取出它的字符串字段就实现了string的传送了。

事还没完,一次偶尔碰到有人说可以使用Marshal转换string。自己查了下MSDN于是一个传送string的另一方法产生:SendMessage仍然是传string,在DefWndProc中可以用string str = Marshal.PtrToStringAnsi(m.LParam)将IntPtr类型的LParam转换为string类型,其实还可以使用IntPtr p = Marshal.StringToHGlobalAnsi(s)将string类型转换为IntPtr类型。

进一步深究,发现这其中还有内情:SendMessage使系统API,IntPtr属于非托管类型,而我们在C#中使用的string等类型是托管类型,使用Marshal转换其实真正意义是实现了托管与非托管类型的转换。看来在C#与非托管的C++/C进行交互传递数据时,要少不了Marshal的身影了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。