来源: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传递字符串的更多相关文章

  1. 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数

    [问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...

  2. JS 拼装代码的HTML onClick方法传递字符串

    有时会在JS中拼装HTML代码,这时在HTML中出现的onClick()方法中: 1.出现传递Num型的数据,直接拼装进去即可: 2.可能会出现传递字符串的情况,处理方法比较特殊,如下: a:直接字符 ...

  3. Shell如何传递字符串

    Shell 在写函数的时候,有时候需要传递字符串,由于字符串中有空格,所以结果总是不对,下面写个小例子,解决这个问题: #!/bin/bash # value init TT="adb sh ...

  4. 如何在存储过程的IN操作中传递字符串变量

    原始SQL如下: SELECT MONTH(OrderTime) AS datetype, SUM(DeliveryCount) AS decount, Region FROM (SELECT dbo ...

  5. setTimeout 里 传递字符串代码报错

    js高程 第三版 p203 重点:超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模 式下指向window 对象,在严格模式下是undefined. 不过这里仅仅解释前半句: ...

  6. JS函数传递字符串参数(符号转义)

    原文链接:https://blog.csdn.net/Myname_China/article/details/82907965 JS函数传递字符串参数,如果没有转义处理,在接收的时候无法正确的接收字 ...

  7. 进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用

    参数发送进程: CString csCmd=AfxGetApp()->m_lpCmdLine; if (!csCmd.IsEmpty()) { pWndPrev->SendMessage( ...

  8. VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的

    消息作用:    在进程间共享数据(内部通过创建内存映射文件) 消息介绍:需要用到的数据结构/类型:typedef struct tagCOPYDATASTRUCT {    ULONG_PTR dw ...

  9. Unity 发布的 WebGL 使用SendMessage传递多个参数

    如果要实现Unity与浏览器的数据交互一般都会采用两种方式 方法一: Application.ExternalCall("SayHello","helloworld&qu ...

随机推荐

  1. http://blog.csdn.net/steveguoshao/article/details/38414145

    http://blog.csdn.net/steveguoshao/article/details/38414145

  2. JS辨别访问浏览器

    项目中需要扫描二维码之后自动分辨出是android还是ios系统,针对于不同的系统进行不同的下载. <script type="text/javascript"> /* ...

  3. Framework元数据向导错误之BMT-MD-6001与BMT-IMP-0002

    1:错误BMT-MD-6001的两种处理方法 在Framework中创建Project后,运行元数据向导从数据库连接中向物理层导入数据表,报错如下 环境如下:Framework版本:10.2.0,Co ...

  4. ormlite操作表记录

    实体类的创建对应表中people表, @DatabaseTable(tableName="people") public class People { @DatabaseField ...

  5. <c:redirect>标签的使用

    <c:redirect>标签的使用代码例子 redirect.jsp <%@ page contentType="text/html" pageEncoding= ...

  6. Failed to initialize storage module: user 的解决方式

    网上提供了一种解决方法就是在session_start()前把session的存储方式改为files,即加入以下一句代码 if (ini_get('session.save_handler') !== ...

  7. Android系统源代码——所需工具

    一.概述 众所周知,Android移动操作系统是Google花费了很大的财力.物力及人力的前提下,推广到世界各个角落,以开放源代码的方式(当然也不是完全开放所有),使其在世界范围内迅速漫延开来,到目前 ...

  8. zookeeper 入门讲解实例 转

    转  http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html zookeeper使用和原理探究(一) zookeeper介绍zo ...

  9. 微信小程序—智能小蜜(基于智能语义解析olami开放平台)

    概述 该程序支持功能有查天气.查诗词.查百科.算算术.查日历.看笑话.看故事.聊天等,通过用户输入语句智能解析用户意图输出相应答案. 详细 代码下载:http://www.demodashi.com/ ...

  10. PHP递归方式把一个数组里面的null转换为空字符串”的方法

    在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把null转换成空字符串'',这个时候就需要递归的方式进行.直接上代码如下: //递归方式把数组或字符串 n ...