VC进程间通信方法之一

编写的一个监控程序,需要监视另外一个程序的运行状况

参考了:http://blog.csdn.net/mail_cm/article/details/7902904

之中的WM_COPYDATA方式,只是把过程详细了一下,同时改正了里面的一些不兼容的问题


首先创建一个对话框程序-基于对话框-项目名DataSend

添加一个Edit控件,并为这个控件添加一个CString类型的成员变量m_strCopyData

添加一个Button控件,并编写响应函数如下:(这个按钮的ID设置为:IDC_BUTTON_Send)

void CDataSendDlg::OnBnClickedButtonSend()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();                                       // 更新数据
	CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv"));    // 查找DataRecv进程
	if(pWnd==NULL){
		MessageBox(_T("Unable to find DataRecv."));
		return;
	}
	COPYDATASTRUCT cpd;                     // 给COPYDATASTRUCT结构赋值
	cpd.dwData = 0;
	cpd.cbData = (m_strCopyData.GetLength()+1) * sizeof(TCHAR);
	cpd.lpData = (void*)m_strCopyData.GetBuffer(cpd.cbData);
	pWnd->SendMessage(WM_COPYDATA,NULL,(LPARAM)&cpd);   // 发送
}


这里尤其要注意cpd.cbData的字符长度的那句话,一方面要+1,另一方面要*sizeof(TCHAR)

这样才能在unicode字符集下正常使用

然后创建另一个对话框程序-基于对话框-项目名DataRecv


一方面要在这个项目的DataRecvDlg.cpp文件中的消息映射段增加一个响应函数:

BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_COPYDATA()//这个是我们增加的
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
其次要在头文件中增加一个声明:

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

并将这个函数在cpp中定义:

// 手动增加的函数
BOOL CDataRecvDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	m_strRecvData = (LPTSTR)(pCopyDataStruct->lpData);
	// 获得实际长度的字符串
	m_strRecvData = m_strRecvData.Left(pCopyDataStruct->cbData);
	// 更新数据
	UpdateData(FALSE);
	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
其中m_strRecvData这个成员变量属于向这个对话框中添加的Edit控件!

这样,二者之间就能够实现正常通信了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值