zoukankan      html  css  js  c++  java
  • 进程间通信,把字符串指针作为参数通过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章。

  • 相关阅读:
    经典SQL语句大全
    SQL中With AS
    SQL Server 2008 r2 安装过程图解
    TFS2010中如何添加用户
    SQL中标准函数范例
    关闭子窗体时刷新父窗体
    sharepoint网站备份和还原
    LogHelper类
    TFS2010用户解锁
    ADHelper类
  • 原文地址:https://www.cnblogs.com/xingrun/p/3464877.html
Copyright © 2011-2022 走看看