mfc 进程间通信1

进程间通信 ,前提肯定必须要有两个应用程序 (设 a1, a2)

假设 a1 要给 a2 发送消息

1. 首先 给a2 预设一个标记 这个就随便起就可以,但是要起的有意义(方法如下) 

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

CString sProp="MYFLAG";

::SetProp(::AfxGetMainWnd()->m_hWnd,sProp,(HANDLE)1);

}

//以上就是 a2 应用程序的主窗口预设了一个标记  “MYFLAG”

2. 第二步就是a1 应用程序 得到a2应用程序的主窗口句柄 (如下:)

//查找 a2 窗口
HWND   hWnd
A=NULL; a2 应用程序主窗口的句柄
HWND   hWndPrevious   =   ::GetWindow(::GetDesktopWindow(),GW_CHILD);     
while   (::IsWindow(hWndPrevious))     
{     
//   检查窗口是否有预设的标记?     
//   有,则是我们寻找的主窗     
if   (::GetProp(hWndPrevious,   "MYFLAG"))     
{     
hWndA= hWndPrevious;
break;
}     
//   继续寻找下一个窗口     
hWndPrevious   =   ::GetWindow(hWndPrevious,GW_HWNDNEXT);   
}    

if(hWndA)
 

//得到了 a2 应用程序主窗口的句柄

else

//失败

3. 第三步 你就可以操作了 比如 激活 , 最大化, 最小化, 发送消息...

//   主窗口已最小化,则恢复其大小     
if(::IsIconic(hWndA))     
::ShowWindow(hWndA,SW_RESTORE);     
//   将主窗激活     
::SetForegroundWindow(hWndA);     
//   将主窗的对话框激活     
::SetForegroundWindow(     
::GetLastActivePopup(hWndA)); 
/
/发送消息

::SendMessage(hWndA,MYMSG,0,0);

4. 如果你想传更多的信息可以内存共享的方式去传输

a1 把信息写到共享内存里面

HANDLE hRecvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 1000000, "HanxunSSDBDataMap");
BYTE* lpData=NULL;
if (hRecvMap != NULL)
{
lpData = (LPBYTE)MapViewOfFile(hRecvMap, FILE_MAP_WRITE, 0, 0, 0);
if (lpData == NULL)
{
CloseHandle(hRecvMap);
hRecvMap = NULL;
}
}
else
return;

CString sProjectID;
CString sFilePath ;

CAFileMapData mapData; //CAFileMapData 是自定义的类
sprintf(mapData.szParam1,sProjectID,sProjectID.GetLength());
memcpy(lpData, &mapData, sizeof(CAFileMapData));

sprintf(mapData.szParam2,sFilePath,sFilePath.GetLength());
memcpy(lpData, &mapData, sizeof(CAFileMapData));


a2 可以从共享的内存里读到数据

HANDLE m_hReceiveMap = OpenFileMapping(FILE_MAP_READ, FALSE, "HanxunSSDBDataMap");
if (m_hReceiveMap == NULL)
return;
BYTE* m_lpbReceiveBuf = (LPBYTE)MapViewOfFile(m_hReceiveMap,FILE_MAP_READ,0,0,0);
if (m_lpbReceiveBuf == NULL)
{
CloseHandle(m_hReceiveMap);
m_hReceiveMap=NULL;
return;
}

CAFileMapData mapData;
memcpy(&mapData, (char*)(m_lpbReceiveBuf), (int)sizeof(CAFileMapData));
CString sProjectID= mapData.szParam1;
CString sFilePath = mapData.szParam2;


这样 a2 就 得到了 a1 传过来的 CString sProjectIDCString sFilePath ;

有说错的地方 望大家帮忙指正 谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值