当前位置:首页 >> 万物互联

原创利用实现进程间通物业

万物互联  |  2021-09-06  |  来源:潜江物联网云平台

进程间通信的方法有多种,其中,对于少量数据可以用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;

}

武汉哪家医院妇科医院好
米诺地尔酊用多久能生发
云南九洲医院好不好