参数发送进程:

CString csCmd=AfxGetApp()->m_lpCmdLine;
if (!csCmd.IsEmpty())
{
pWndPrev->SendMessage(MYWM_NEWPARAM,0,(LPARAM)(&csCmd));
}

  参数接受进程:

CString csCmd=_T("");
CString* pStr = (CString*) lParam;
ASSERT(pStr!=NULL);
csCmd = *pStr;

  经过测试不起作用,不过如果我传的是一个常量指针,那就可以起作用,例如:

发送进程:

pWndPrev->SendMessage(MYWM_NEWPARAM,0,(LPARAM)(char*)("我是一只小小鸟。。。"));

  接受进程:

CString csCmd=_T("");
csCmd = (char *)lParam;

  不知其所以然。。。进程私有空间?如果是私有空间,那么为什么常量字符串可以传递成功?。。。不知其所以然。。。

那么,如果我将参数先强制转化为常量字符串,然后传递可行呢?

发送进程:

CString csCmd=AfxGetApp()->m_lpCmdLine;
if (!csCmd.IsEmpty())
{
pWndPrev->SendMessage(MYWM_NEWPARAM,0,(LPARAM)((char*)((LPCTSTR)csCmd)));
}

  接受进程如上面不变。

得到结果,接受进程没有崩溃,但是取出来的字符串是乱码。。。

不知其所以然,应该就是进程私有空间不可侵犯吧

然后看到了《用WM_COPYDATA实现进程通信》和《浅谈进程间的消息传递》,尝试试试WM_COPYDATA来实现,吼吼~

发送进程:

接受进程:

发现一个问题,发送进程不可以使用PostMessage来发送消息,否则接受进程接受不到实际参数,估计是因为PostMessage发送后直接返回,然后在接受进程未取出数据之前,数据就已经被销毁导致的,查资料,找到《浅谈Sendmessage 和Postmessage 》中关于这一点有说明:

3)SendMessage发送WM_COPYDATA消息在进程间传送数据
WM_COPYDATA消息主要目的是允许在进程间传递少量只读数据。SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。

说明自己的判断是正确的,那么还有个问题,WM_COPYDATA是如何实现参数传递从而完成进程间通信的呢?肯定不是普通的消息响应。

查询资料《浅谈进程间的消息传递》得知:

13 WM_COPYDATA消息
  WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

什么是文件映射?见《把脉VC++》第12章。

进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用的更多相关文章

  1. js_参数的get传输,从一个页面到另外一个页面。

    2017年10月31日,今天是万圣节,欢乐谷搞事情. 刚接触前端那会是分不清,前端和后台的,后台的数据如何传输到前端的. 现在用的还是Jquery的ajax请求后台数据到前端页面的,需要学习的地方还有 ...

  2. C++字符串指针与字符数组的区别

    今天发现这样一个问题 #include <iostream> using namespace std; int main() { ]; strcpy_s(ch1,");//编译通 ...

  3. C++ 字符串指针与字符串数组

    在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...

  4. Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)

    Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...

  5. 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  6. C语言 内存分配 地址 指针 数组 参数 实例解析

    . Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...

  7. C语言回顾-字符串指针

    1.字符串指针 char *变量名="字符串内容"; char ch='b'; char *p1=&ch; char *str="C Language" ...

  8. [BS-01] 根据字符串对象的参数自动计算用来显示该字符串的UI控件的宽和高

    根据字符串对象的参数自动计算用来显示该字符串的UI控件的宽和高 1.  影响昵称Label的高和宽的因素: 字体和字号大小.文字多少.高度取决于是否固定了宽度(是否限制了最大的宽度和高度) 2. 使用 ...

  9. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

随机推荐

  1. 出现”/var/lib/mysql/mysql.sock“不存在的解决方法

    这种情况大多数是因为你的mysql是使用rpm方式安装的,它会自动寻找 /var/lib/mysql/mysql.sock 这个文件,通过unix socket登录mysql.常见解决办法如下:1.创 ...

  2. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  3. JQ实现图片上传预览功能

    <input type="file" name="img" id="test1"> <img src="&quo ...

  4. Mogodb 存储DateTime问题

    由于mogodb默认用的是国际日期utc和中国时间有8小时时差. c#当中利用特别属性来解决,如: /// <summary>        /// 创建日期        /// < ...

  5. twincat3新建cpp提示"在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"

    自己之前在windows下面写过一些c++的函数,想在倍福工控机上直接使用,发现添加了.cpp和.h文件后无法完成编译,会提示 在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加“#includ ...

  6. log4j的学习和log4j在程序中使用的加载作用过程

    昨天进行代码评审的时候,大家都纠结在了日志信息应该如何输出上,其实我想大家应该一直都在使用log4j来对日志信息进行输出,但是未想应该有很大一部分人对log4j是不了解的,我遇到这个问题的时候也到网上 ...

  7. 前端学习之——js解析json数组

    ** 前端学习之——js解析json数组** 解析json数组即对JSONArray的遍历 一.对于标准的json数组如: var result=[{"flag":1," ...

  8. Flutter实战视频-移动电商-33.列表页_子类和商品列表交互效果

    33.列表页_子类和商品列表交互效果 主要实现点击小类下面的列表跟着切换 获取右侧下面的列表信息,即要传递大类的id也要传递小类的,所以需要把左侧的大类的id也要Provide化 可以看下网站上的接口 ...

  9. 利用StringBuffer来替换内容

    package com.test.java; public class StringBufferTest { public static void main(String[] args) { Stri ...

  10. uoj#418. 【集训队作业2018】三角形(线段树合并)

    传送门 好迷啊--膜一下ljz 考虑每个操作,如果把操作按先后顺序放到序列上的话,操作一就是把\(w_i\)的石子放到某个节点,那么就是在序列末端加入\(w_i\),然后根据贪心肯定要把它所有儿子的石 ...