绪:跨进程数据交互方式可以使用多种方式,比如socket,本地文件,windows环境下自带的sendmessage之CopyData消息
这里只设计CopyData数据的封装处理
首先是简单的int数据
发送:
int i_value = 1;
COPYDATASTRUCT data;
data.dwData = 1000;
data.cbData = sizeof(i_value);
data.lpData = &i_value;
::SendMessage(toWnd, WM_COPYDATA, (WPARAM)fromWin, (LPARAM)&data);
其次是字符串
发送:
std::string param = "1";
COPYDATASTRUCT data;
data.dwData = 2000;
data.cbData = param.length();
data.lpData = ¶m[0];
::SendMessage(toWnd, WM_COPYDATA, (WPARAM)fromWin, (LPARAM)&data);
再次是结构体
结构体
struct Tis {
int cmd;
std::string data= "1";
};
发送:
Tis param;
param.cmd = 1;
COPYDATASTRUCT data;
data.dwData = 3000;
data.cbData = sizeof(param);
data.lpData = ¶m;
::SendMessage(toWnd, WM_COPYDATA, (WPARAM)fromWin, (LPARAM)&data);
最后处理接收
接收:
switch(pCopyDataStruct->dwData)
{
case 1000:
printf("%d",pCopyDataStruct->lpData);
break;
case 2000:
{
LPCTSTR lstrMsg = (LPCTSTR)(pCopyDataStruct->lpData);
CString strMsg(lstrMsg);
printf(strMsg);
}
break;
case 3000:
{
auto dt = reinterpret_cast<Tis*>(pCopyDataStruct->lpData);
printf("%d--%s", dt.cmd, dt.data);
}break;
}
结:通过copydata可以实现进程之间的复杂的数据信息传递
问:copydata依赖sendmessage发送内存数据,为什么B进程修改dt.data的数据修改后A进程的param.data数据没有改变