进程间通讯应该是老的内容了,相信用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 的处理函数,关联映射,和上边描述的过程一样,在处理函数中添加相应的处理代码。这里就不多说了!

posted on 2010-12-27 23:18  GT_Andy  阅读(1769)  评论(0编辑  收藏  举报