进程间通信,把字符串指针作为参数通过SendMessage传递给另一个进程,不起作用
参数发送进程:
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传递给另一个进程,不起作用的更多相关文章
- js_参数的get传输,从一个页面到另外一个页面。
2017年10月31日,今天是万圣节,欢乐谷搞事情. 刚接触前端那会是分不清,前端和后台的,后台的数据如何传输到前端的. 现在用的还是Jquery的ajax请求后台数据到前端页面的,需要学习的地方还有 ...
- C++字符串指针与字符数组的区别
今天发现这样一个问题 #include <iostream> using namespace std; int main() { ]; strcpy_s(ch1,");//编译通 ...
- C++ 字符串指针与字符串数组
在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...
- Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...
- 【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- C语言 内存分配 地址 指针 数组 参数 实例解析
. Android源码看的鸭梨大啊, 补一下C语言基础 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/detai ...
- C语言回顾-字符串指针
1.字符串指针 char *变量名="字符串内容"; char ch='b'; char *p1=&ch; char *str="C Language" ...
- [BS-01] 根据字符串对象的参数自动计算用来显示该字符串的UI控件的宽和高
根据字符串对象的参数自动计算用来显示该字符串的UI控件的宽和高 1. 影响昵称Label的高和宽的因素: 字体和字号大小.文字多少.高度取决于是否固定了宽度(是否限制了最大的宽度和高度) 2. 使用 ...
- 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数
#include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...
随机推荐
- C++之友元机制(友元函数和友元类)
一.为什么引入友元机制? 总的来说就是为了让非成员函数即普通函数或其他类可以访问类的私有成员,这确实破坏了类的封装性和数据的隐蔽性,但为什么要这么做呢? (c++ primer:尽管友元被授予从外部访 ...
- JAVA 内部类 (三)实例
为什么要用内部类:控制框架 一个“应用程序框架”是指一个或一系列类,它们专门设计用来解决特定类型的问题.为应用应用程序框架,我们可从一个或多个类继承,并覆盖其中的部分方法.我们在覆盖方法中编写的代码用 ...
- 自适应文案提示框、无数据图片加载<IOS小组件>
非常感谢,帮助我的朋友们,谢谢你们. 该组件的编写仅仅用来不到4个小时,包括测试与修改bug.为他起名为AdaptivePromptDialogBox(就是自适应文案提示框): 呆毛地址:链接 < ...
- Empire Strikes Back
题意: 给定$K$个数字,求最小的正整数$n$,使得$\prod_{i=1}^{K}{a_i !} | n!$ 解法: 注意到$$\sum_{p为质数}{1/p} = O(loglogn)$$, 这样 ...
- SpringMVC数据绑定一(基本类型、数组和对象(简单对象、层级对象、多参数对象))
一.int和Integer类型 如:参数为int类型的请求 @Controller public class TestController { @RequestMapping(value=" ...
- java.endorsed.dirs
java.ext.dirs 用于扩展jdk的系统库,那么 -Djava.endorsed.dirs 又有什么神奇的作用呢? java提供了endorsed技术: 关于endorsed:可以的简单理解为 ...
- 关于window 查看端口命令
今天小R又知道了一个新的小常识,个人觉得还是蛮实用的,可能对于有些新手来讲应该也不知道吧. 如:大家都知道window查看命令是用 “netstat -an” , 如图显示一大推打开的端口. 但 ...
- 也谈Flash mmorpg地图问题【转】
网上看一篇关于目前几个流行flash mmorpg地图实现的分析,这里也想说说自己的一些看法. 常见的三种方式:1.整图2.Tile元素拼装3.栅格化切片 整图 整图加载很好理解直接加载一张背景图.这 ...
- LeetCode:104 Maximum Depth of Binary Tree(easy)
题目: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...
- 6 手写Java LinkedHashMap 核心源码
概述 LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少 ...