进程间通讯应该是老的内容了,相信用VC的大侠们都知道,书本上也都有介绍。我在这只是对自己用过的东西简单的总结一下,希望对有兴趣者有帮助。
WINDOWS中进程间通讯的方式很多,如:消息机制,共享内存机制,SOCKET,COM,RPC等等,需要时可以根据具体情况来选择使用的方式。我在这本文中仅介绍进程间的自定义消息通讯机制。
1,WINDOWS中自定义消息的定义和使用;
在WNDOWS中消息分系统消息和自定义消息。系统消息定义从0到0x3FF,使用0x400到0x7FFF定义自己的消息。Windows把0x400定义为WM_USER。如果想定义自己的一个消息,可以在WM_USER上加上一个值:
#define WM_CONTROLPRINT WM_USER+1001
另一种自定义窗口消息的方法是用RegisterWindowsMessage()函数来注册这个消息。与在WM_USER上加上某个数相比,它的好处是不必考虑所表示的消息标识符是否超出工程的允许范围。如:
const UINT WM_CONTROLPRINT=RegisterWindowMessage("reg_data");
在接收消息的程序中,需要对添加对应消息的响应处理函数,并将消息和消息处理函数关联,要不它不知道消息发给谁:
//函数定义,在//AFX_MSG中
afx_msg LRESULT OnControlPrint(WPARAM wParam,LPARAM lParam);
//函数实现
LRESULT CSendDlg::OnControlPrint(WPARAM wParam,LPARAM lParam)
{
}
//关联映射,在BEGIN_MESSAGE_MAP中
ON_MESSAGE(WM_CONTROLPRINT,OnControlPrint)//使用WM_USER+1001定义的消息
ON_REGISTERED_MESSAGE(WM_CONTROLPRINT,OnControlPrint)//使用RegisterWindowMessage定义的消息
消息如何传递呢?我们需要发送消息时,可以使用PostMessage和SendMessage。这两个消息发送函数不一样的地方就是SendMessage发送完消息后会等待消息处理函数处理完成后返回,PostMessage则不等待。所以,可以说PostMessage是不可靠的,实际运用中可以根据具体情况来确定用那一个。这两个函数的具体使用请查看MSDN。
如我向主窗体发送一个消息(第一个参数是接收消息的窗体句柄,第二个参数是要发送的消息,后边两个为随消息发送的参数信息):
::SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_CONTROLPRINT,NULL,0);
2,使用自定义消息在进程间通讯;
我们可以用VC60建立两个基于对话框的工程,一个命名为Send,一个命名为Revice。
在Send对话框中添加一个名成为IDC_BUTTONSEND的按钮。
在SendDlg.h和ReviceDlg.g中都添加自定义消息。消息实现进程间通信,需要在这两个程序中定义或注册相同的消息,才能保证数据通信顺利进行:
#define WM_CONTROLPRINT WM_USER+1001
在Send工程中添加IDC_BUTTONSEND按钮的单击处理事件,并添加代码:
void CSendDlg::OnButtonsend()
{
//获取窗口句柄
CWnd *pWnd=CWnd::FindWindow(NULL,_T("Revice"));
if(pWnd==NULL)
{
AfxMessageBox("接收程序没有运行!");
return ;
}
//发送消息
pWnd->SendMessage(WM_SENDYKDISABLE,NULL,0);
}
在Revice工程中添加WM_CONTROLPRINT 的处理函数,关联映射,和上边描述的过程一样,在处理函数中添加相应的处理代码。这里就不多说了!