底层工作程序的实现
最后,来介绍一下底层工作程序的实现过程。底层工作程序也是一个单文档应用程序(当然,对于多文档应用程序也是一样)。由于主控程序是通过对应用程序主窗口标题的捕获来得到底层程序主窗口句柄的。因此需要在底层工作程序应用类的初始化应用函数InitInstance()中添加(在函数末尾添加)下面语句:
| m_pMainWnd->SetWindowText("Receiver"); |
以设置底层工作程序的窗口标题。同时还要在主框架类的头文件MainFrm.h中添加与主控程序一样的自定义消息定义:
| #define WM_COMM WM_USER+100 |
由于底层程序需要接收并响应主控程序发出的通知消息,因此还要在底层工作程序中添加对自定义消息WM_COMM的响应处理:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() //}}AFX_MSG_MAP ON_MESSAGE(WM_COMM,OnSendMsg) END_MESSAGE_MAP() …… void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam) { if(wParam==0 && lParam==0) AfxMessageBox("主控程序发送命令一!"); if(wParam==0 && lParam==1) AfxMessageBox("主控程序发送命令二!"); if(wParam==1 && lParam==0) AfxMessageBox("主控程序发送命令三!"); } |
此后就可以通过辨别消息的两个消息参数来区分主控程序发送的是哪一个命令从而可以执行相应的操作。执行主控程序和底层工作程序由于本程序采用的是SendMessage()所以当主控程序发送消息给底层工作程序时,底层工作程序弹出响应的模式对话框,在没有关闭对话框前此消息未处理完,SendMessage()也就没有执行完,所以主控程序呈阻塞状态,如改用PoseMessage()则不会发生阻塞,具体选用哪个函数还应根据实际要求灵活掌握。
结论:
通过上面的实例可以看出利用消息进行进程间通信不失为一种便捷的方法,进程间的数据交换量不大却能完成相当的功能,上下层次有着明显的接口,上层和底层只通过这个接口进行通讯,因此只要对上下层程序制定好规范详尽的协议便可编制出协调性很好的软件控制系统。
|