进程间通讯应该是老的内容了,相信用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 的处理函数,关联映射,和上边描述的过程一样,在处理函数中添加相应的处理代码。
- 浏览: 15204 次
- 性别:
- 来自: 西安
相关推荐
自定义消息机制的核心思想是创建一个类来封装消息的发送、接收和处理过程,而不是依赖于Windows的消息循环。以下是一些关键步骤和知识点: 1. **定义消息结构体**:首先,我们需要定义一个结构体来存储消息信息。这...
通过UserMessageDemo,你可以了解到自定义消息的完整流程,包括定义、发送和处理,这对于理解MFC应用程序的内部通信机制非常有帮助。你可以下载并运行该示例,查看其工作原理,并根据需要修改和应用到自己的项目中。
总结来说,自定义消息在MFC中提供了一种强大的通信机制,通过注册和处理自定义消息,可以灵活地扩展应用程序的功能,实现更复杂的用户交互。在对话框编程中,利用自定义消息可以更好地控制对话框的行为,提高程序的...
在Windows编程中,自定义消息(Custom Message)是一种扩展系统消息机制的方法,允许开发者定义自己的消息类型,以处理特定的应用程序需求。在Visual C++(VC++)环境中,自定义消息的实现通常涉及到Windows消息队列...
自定义消息是Windows消息机制的一部分,允许程序员扩展系统消息机制,实现特定的功能需求。本篇文章将深入探讨MFC中自定义消息的实现。 自定义消息在MFC中通常通过`WM_USER`开始的数值来定义,这是Windows消息ID...
发送进程需要知道接收进程的窗口句柄(HWND),这可以通过进程间通信机制获取。例如: ```cpp PostMessage(hwndReceiver, myMessage, wParam, lParam); ``` 3. **处理消息**:在接收进程的窗口过程(WndProc)中...
除了基本的发送和接收,自定义消息还可以用于实现复杂的通信机制,比如线程间的通信。在多线程应用程序中,使用自定义消息可以在安全的环境下交换数据,避免同步问题。 此外,自定义消息也可以用于封装特定的操作,...
MFC是基于Windows消息机制的,它封装了Windows API中的各种消息处理。在MFC中,消息主要通过`ON_MESSAGE`、`ON_COMMAND`和`ON_BN_CLICKED`等宏来处理,但这些宏只能处理系统预定义的消息。为了处理未在标准消息表中...
在VC++编程环境中,MFC(Microsoft Foundation Classes)库为开发者提供了一种高效的方式来构建Windows应用程序。...通过学习这部分内容,开发者可以更好地控制和扩展其应用程序的内部通信机制,提升程序设计的灵活性。
首先,理解Windows消息机制是至关重要的。Windows消息是应用程序之间和应用程序内部进行通信的一种方式,它由一个消息ID和相关参数组成。当用户进行操作,如点击按钮或移动鼠标,Windows系统会生成相应消息并将其放...
总之,"消息黑客"是Windows编程中的一种高级技巧,它涉及到Windows消息机制、API调用和程序间通信。理解并熟练运用这一技术,可以提升开发者解决复杂问题的能力,但同时也需要谨慎行事,以维护系统的安全和稳定。
在Windows编程中,VC++...总的来说,通过自定义消息,开发者可以创建更复杂的应用程序逻辑,实现更灵活的通信机制,同时保持Windows消息系统的稳定性。理解并熟练运用自定义消息是提升VC++编程技能的关键步骤之一。
【自定义消息】在Windows编程中,是一种扩展标准消息机制的方法。当标准的消息无法满足特定需求时,开发者可以创建自己的消息类型。在VC中,自定义消息通常通过`RegisterWindowMessage`函数注册,该函数返回一个唯一...
3. **自定义消息循环**:在`Run`方法中,你需要编写自定义的消息循环。这通常包括调用` PeekMessage `或`GetMessage`函数来检查是否有待处理的消息,然后通过`TranslateMessage`和`DispatchMessage`将消息传递给相应...
在Windows操作系统中,消息是进程间通信的一种方式,每个消息都有一个唯一的整数标识,即消息ID。通过注册自定义消息ID,我们可以创建并发送自己的消息,以便在程序的不同部分之间传递信息。 要创建自定义消息,...
自定义消息是Windows消息机制的一部分,它允许开发者定义自己的消息类型,以扩展系统默认的消息功能。自定义消息的定义通常通过`WM_USER`常量开始,例如`WM_USER + 100`表示一个自定义消息类型。 以下是使用自定义...
在BCB6(Borland C++ Builder 6)中,自定义消息是开发者扩展系统功能,实现特定通信机制的一种重要技术。自定义消息允许程序员创建自己的消息类型,这些消息可以由一个组件发送给另一个组件,或者在应用程序的各个...
MFC是基于Windows消息机制的,它将Windows API中的消息队列、消息循环和窗口过程等概念封装在C++类中,使得消息处理更加方便。在MFC中,每个窗口类(如CWnd)都有一个消息映射表,用于定义该窗口可以响应哪些消息...
本话题主要聚焦于如何在MFC中实现自定义消息以及在模式对话框之间进行通信。 首先,让我们深入理解自定义消息。在Windows系统中,消息是进程间或线程间通信的基本方式。标准的消息如WM_PAINT、WM_KEYDOWN等已预定义...
通过使用自定义消息机制,可以有效地实现Form间的通信。本文将详细介绍如何在C#中实现自定义消息在Form间传递的过程,包括发送端和接收端的具体实现细节。 #### 发送端实现步骤 **Step1: 添加引用** 首先,需要在...