SenndMessage实现进程间通讯

 

    今天尝试使用senndmessage实现进程间通讯,百度一下后得到的方法是这样的:

    SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据: 这个函数的原型及其要用到的结构如下: SendMessage(hwnd,WM_COPYDATA,wParam,lParam);
其中,WM_COPYDATA对应的十六进制数为0x004A wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:
typedef struct tagCOPYDATASTRUCT{
    DWORD dwData;//用户定义数据
    DWORD cbData;//数据大小
    PVOID lpData;//指向数据的指针
}COPYDATASTRUCT;
该结构用来定义用户数据。 具体过程如下:
首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息. 接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.

 

    于是按照上述方法进行尝试。但不成功。sendmessage返回总是0。断点进去发现findwindow执行正常,不解。

    运行被通讯程序断点查看句柄地址后,再运行通讯程序,发现findwindow返回的值与被通讯程序的句柄地址不同。

    仔细查看后发现findwindow反馈的是一个CWnd实例,通过CWnd->m_HWnd获得目标窗口句柄。

    在查找过程中用到了spy++,很实用的工具。同时感谢平乐兄,不吝赐教!

        

    其实总结来看只是个很小的问题,但发现自己的WINAPI32知识还是很匮乏,需要继续努力!

        

    附实现代码:

        

  1. //Test1
  2. void CTest1Dlg::OnOK() 
  3. {
  4.     // TODO: Add extra validation here
  5.     CString message;
  6.     GetDlgItemText(IDC_EDIT1,message);  
  7.     CWnd * t_hwnd;
  8.     t_hwnd = FindWindow(NULL,"Test2");
  9.     if(!t_hwnd)
  10.         return;
  11.     
  12.     COPYDATASTRUCT   cds;   
  13.     cds.dwData   =   0;   
  14.     cds.cbData   =   message.GetLength();   
  15.     cds.lpData   =   malloc(message.GetLength());   
  16.     memcpy((char*)cds.lpData,message,message.GetLength());
  17.     ::SendMessage(t_hwnd->m_hWnd,WM_COPYDATA,(WPARAM)m_hWnd,(LPARAM)(LPVOID)&cds);
  18.     free(cds.lpData);
  19. }


  1. //Test2
  2. BOOL CTest2Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
  3. {
  4.     // TODO: Add your message handler code here and/or call default
  5.     char * message = (char *)malloc(pCopyDataStruct->cbData+1);
  6.     memcpy(message,(char*)pCopyDataStruct->lpData,pCopyDataStruct->cbData);
  7.     message[pCopyDataStruct->cbData] = '/0';
  8.     SetDlgItemText(IDC_EDIT1,message);
  9.     free(message);
  10.     return CDialog::OnCopyData(pWnd, pCopyDataStruct);
  11. }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值