您的位置:首页 > 编程语言 > C语言/C++

VC进程间通信方法之一

2013-02-21 14:05 232 查看
编写的一个监控程序,需要监视另外一个程序的运行状况

参考了: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控件!

这样,二者之间就能够实现正常通信了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VC++ vs2008