WM_COPYDATA的实现原理

WM_COPYDATA是一种非常简单的进程间通信的方式,很容易实现。下面是一个使用WM_COPYDATA来实现进程间通信的一个例子。发送端,接收端的例子代码摘自 http://blog.csdn.net/111222/archive/2001/10/10/7241.aspx

发送端:

HWND hWnd = FindWindow(NULL,"MyApp");

if(hWnd!=NULL)

{

      COPYDATASTRUCT cpd; /*给COPYDATASTRUCT结构赋值*/

      cpd.dwData = 0;

      cpd.cbData = strlen("字符串");

      cpd.lpData = (void*)"字符串";

      ::SendMessage(hWnd,WM_COPYDATA,NULL,(LPARAM)&cpd);//发送!

      /*完事儿了!!*/

}

 

接收端:

afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);

ON_WM_COPYDATA()/*消息映射*/

BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
        AfxMessageBox((LPCSTR)(pCopyDataStruct->lpData));/*利用对话框表示收到消息*/

        return CWnd::OnCopyData(pWnd, pCopyDataStruct);
}

很简单吧。好,我们来看看COPYDATASTRUCT结构

typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;//数据长度
    PVOID lpData;//存放通信数据的内存的地址
} COPYDATASTRUCT, *PCOPYDATASTRUCT;
一个进程怎么可以访问另一个进程的内存地址呢?msdn有一句话:The data being passed must not contain pointers or other references to objects not accessible to the application receiving the data.
从这句话可见,我们不能传递是指针的数据,如果一个进程怎么可以访问另一个进程的内存地址的话,传指针数据有什么关系呢,这说明进程并不是直接访问另一个进程的内存地址,而是windows做了手脚,至于做了什么手脚,它可能使用了其他
比较底层的进程通信方式来实现,比如共享内存。认识到这一点,我们心里就有底了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值