C#使用SendMessage传递字符串
来源:http://www.cnblogs.com/sizzle/archive/2007/08/29/874796.html
正文:
在C#中使用SendMessage,原本以为很简单的事,却处处碰壁。
在定义消息时忘记了用户可定义消息的边界值,在网上一阵疯找后来发现是const int WM_USER = 0x400。接着是SendMessage的lParam类型不能决定(默认是IntPtr),我想发送字符串信息,就将它定为了string型,然后通过重写DefWndProc接收自定义消息。问题出现:(string) message.lParam提示不能转换,然后使用另一种方法:(string)message.GetLParam(typeof(string)),依然有错,提示应该重载string的构造函数建立string的无参构造函数(够狠)。
后来在网上见到一篇文章“C#用WM_COPYDATA消息来实现两个进程之间传递数据”,经提示想到一方法:用结构体封装string字段,然后传结构体就可以了(结构体有自己的无参构造函数--其实原本想自己写个无参构造函数,却发现在vs2005下无法编译通过,提示不能够创建结构体的无参构造函数)。这样就可以在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的身影了。
C#使用SendMessage传递字符串的更多相关文章
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
[问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...
- JS 拼装代码的HTML onClick方法传递字符串
有时会在JS中拼装HTML代码,这时在HTML中出现的onClick()方法中: 1.出现传递Num型的数据,直接拼装进去即可: 2.可能会出现传递字符串的情况,处理方法比较特殊,如下: a:直接字符 ...
- Shell如何传递字符串
Shell 在写函数的时候,有时候需要传递字符串,由于字符串中有空格,所以结果总是不对,下面写个小例子,解决这个问题: #!/bin/bash # value init TT="adb sh ...
- 如何在存储过程的IN操作中传递字符串变量
原始SQL如下: SELECT MONTH(OrderTime) AS datetype, SUM(DeliveryCount) AS decount, Region FROM (SELECT dbo ...
- setTimeout 里 传递字符串代码报错
js高程 第三版 p203 重点:超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模 式下指向window 对象,在严格模式下是undefined. 不过这里仅仅解释前半句: ...
- JS函数传递字符串参数(符号转义)
原文链接:https://blog.csdn.net/Myname_China/article/details/82907965 JS函数传递字符串参数,如果没有转义处理,在接收的时候无法正确的接收字 ...
- 进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用
参数发送进程: CString csCmd=AfxGetApp()->m_lpCmdLine; if (!csCmd.IsEmpty()) { pWndPrev->SendMessage( ...
- VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
消息作用: 在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT { ULONG_PTR dw ...
- Unity 发布的 WebGL 使用SendMessage传递多个参数
如果要实现Unity与浏览器的数据交互一般都会采用两种方式 方法一: Application.ExternalCall("SayHello","helloworld&qu ...
随机推荐
- ActiveReport开发入门-列表的交互性
Cognos10以来推出了Active Report,和很多人一样,怀着一颗好奇的心,准备接纳和了解一下这个新生儿,于是乎便有了下面的故事. 1:新建一个活动报表,两行一列拖入一个按钮栏和一个列表 2 ...
- Android:Volley源代码解析
简单实例 Volley是一个封装HttpUrlConnection和HttpClient的网络通信框架,集AsyncHttpClient和Universal-Image-Loader的长处于了一身.既 ...
- C++ 之 基础回顾(一)
1 exe 程序
- 【EasyUI】——EasyUI的布局
做一个站点首先要有站点的布局,所谓的布局事实上就是网页的排版.就是说你的网页显示时是什么样子的. 就比方百度的首页: 无论是谁登录.网页都是这个样式的. EasyUI中的网页布局一共分为五部分,分别为 ...
- ormlite操作表记录
实体类的创建对应表中people表, @DatabaseTable(tableName="people") public class People { @DatabaseField ...
- 总想自己动动手系列·2·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(完结篇)
一.准备工作 (1)创建一个web-project工程,部署本地可正常访问,部署在云服务上可访问. (2)理解如何在web.xml文件中配置过滤器,和创建一个自定义的过滤器. (3)懂得如何打war包 ...
- Python set特点
set的特点 set的内部结构和dict很像,唯一区别是不存储value,因此,判断一个元素是否在set中速度很快. set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放 ...
- taro 打包微信小程序运行失败(一)
1.报错信息 thirdScriptError sdk uncaught third Error Cannot read property 'createTextNode' of undefined ...
- 问题解决——MFC SDI程序 CFormView中控件随窗体缩放
从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格.就不用使用那些花钱的商业控件/UI库了. 假设你不想看我打的文字.能够直接拷走代码,自己声明上定义 ...
- HDU1823-Luck and Love-二维线段树(模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1823 好吧,给这题跪了. ..orz.... 一道非常基础的二维线段树的模板题: 可是细节非常多:尤 ...