原创利用实现进程间通物业
进程间通信的方法有多种,其中,对于少量数据可以用WM_COPYDATA方便的实现通信(如果对于大量数据的话,由于SendMessage是阻塞的,只有接收方响应了消息,SendMessage才能返回,否则则一直阻塞,所以,对于大量数据来说,用SendMessage就容易造成窗口假死) 。
本例子分别用WM_COPYDATA实现了两种数据类型的发送,一种为Cstring,另外一种为自定义的结构体Student:
//**********************************************************
#pragma pack(1)
struct Student {
char ID[10];
TCHAR Name[20];
UINT Age;
UINT Grade;
char Room[5];
char Tel[12];
};
#pragma pack()
//**********************************************************
因为需要在接收方的OnCopyData()函数中区分发送的两种不同类型数据。所以就定义了以下两个常量:
#define STRING 1
#define STUDENT 2
发送方:
void CSendDataDlg::OnBtSend() //实现CString类型数据的发送
{
UpdateData(TRUE);
if (m_Empty()) {
m_szData = _T(\"Hello\");
UpdateData(FALSE);
}
// m_szData += \'\\0\';
HWND hWndRcv = ::FindWindow(NULL,\"Receiver\");
if (hWndRcv == NULL) {
AfxMessageBox(_T(\"找不到接收窗口,发送不成功\"));
return ;
}
COPYDATASTRUCT cpd;
Data = STRING; //标志为CString类型
Data = m_tLength() + 1;
//GetLength()只是取得实际字符的长度,没有包括\'\\0\'.
Data = (void*)m_tBuffer(Data);
::SendMessage(hWndRcv,WM_COPYDATA,(WPARAM)this-m_hWnd,(LPARAM)cpd);
m_leaseBuffer();
AfxMessageBox(_T(\"发送成功\"));
}
void CSendDataDlg::OnBtStu() //实现Student类型数据的发送
{
UpdateData();
m_szID += \'\\0\';
m_szName += \'\\0\';
m_szRoom += \'\\0\';
m_szTel += \'\\0\';
m_pStu = new Student();
strcpy(m_pStu-ID,m_tBuffer(m_tLength()));
_tcscpy(m_pStu-Name,m_tBuffer(m_tLength()));
strcpy(m_pStu-Room,m_tBuffer(m_tLength()));
strcpy(m_pStu-Tel,m_tBuffer(m_tLength()));
m_leaseBuffer();m_leaseBuffer();
m_leaseBuffer();m_leaseBuffer();
m_pStu-Age = m_nAge;
m_pStu-Grade = m_nGrade;
HWND hWndRcv = ::FindWindow(NULL,\"Receiver\");
if (hWndRcv == NULL) {
AfxMessageBox(_T(\"找不到接收窗口,发送不成功\"));
return ;
}
COPYDATASTRUCT cpd;
Data = STUDENT; // 标志为Student类型
Data = sizeof(Student);
Data = (PVOID)m_pStu;
::SendMessage(hWndRcv,WM_COPYDATA,(WPARAM)this-m_hWnd,(LPARAM)cpd);
delete m_pStu;
AfxMessageBox(_T(\"发送成功\"));
}
接收方:
在OnInitDialog方法中:
//***************************************************************
//初始化ListCtrl控件
LVCOLUMN column;
sk = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH;
= 80;
ubItem = 0;
zText = _T(\"ID\");
m_sertColumn(0,column);
= 80;
zText = _T(\"Name\");
ubItem = 1;
m_sertColumn(1,column);
= 55;
zText = _T(\"Age\");
ubItem = 2;
m_sertColumn(2,column);
= 55;
zText = _T(\"Grade\");
ubItem = 3;
m_sertColumn(3,column);
= 55;
zText = _T(\"Room\");
ubItem = 4;
m_sertColumn(4,column);
= 80;
zText = _T(\"Tel\");
ubItem = 5;
m_sertColumn(5,column);
物不离身。 BOOL CReceiverDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
switch (pCopyDataStruct-dwData) { // 接收到的是CString类型
case STRING:
m_szData += (LPCSTR)(pCopyDataStruct-lpData);
UpdateData(FALSE);
break;
case STUDENT: // 接收到的是Student类型
CString id,name,room,tel;
UINT age,grade;
CString str;
Student* pStu = (Student*)(pCopyDataStruct-lpData);
id = pStu-ID;
name = pStu-Name;
room = pStu-Room;
tel = pStu-Tel;
age = pStu-Age;
grade = pStu-Grade;
LVITEM item;
// 把接收到的数据显示到ListCtrl控件上
sk = LVIF_TEXT;
int n = m_tItemCount();
tem = n;
ubItem = 0;
zText = tBuffer(tLength());
leaseBuffer();
m_sertItem(item);
m_tItemText(n,1,name);
rmat(\"%d\",age);
m_tItemText(n,2,str);
rmat(\"%d\",grade);
m_tItemText(n,3,str);
m_tItemText(n,4,room);
m_tItemText(n,5,tel);
UpdateData(FALSE);
//delete pStu;
break;
}
// return CDialog::OnCopyData(pWnd, pCopyDataStruct);
return TRUE;
}
武汉哪家医院妇科医院好米诺地尔酊用多久能生发
云南九洲医院好不好
-
吓人曝勇士准备交易詹姆斯报价汤神FMVP
万物互联 | 2020-08-08
-
低功耗广域网络LPWA物联网技术为养老护
万物互联 | 2019-07-16
-
运营商能否成为物联网产业主导力量
万物互联 | 2019-07-16