`
tcspecial
  • 浏览: 911650 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

进程间通信 --windows篇

阅读更多

   需求如下: 当配置文件发生改变时,广播配置信息给所有的进程,通知其重装配置. 

   1. WM_COPYDATA传递消息

   windows下最简单进程通信方式,利用WM_COPYDATA事件, 该事件能够传递一指针来携带消息. 

   

// 查找标题为Sample的窗口,向其发送一字符串
HWND hWnd = FindWindowW(NULL, "Sample");
if (hWnd != NULL) 
{
	this->setWindowTitle("dialog_send");

	char szMsg[512];
        strcpy(szMsg,"hello world");

	COPYDATASTRUCT cpd;
	cpd.dwData = 0;
	cpd.cbData = strlen(szMsg);
	cpd.lpData = szMsg;
	
	// 同步发送消息
	SendMessageW(hWnd, WM_COPYDATA, NULL, (LPARAM)&cpd);
}

 

    这里就有一个问题,WM_COPYDATA消息,只能使用 SendMessage (同步发送消息,必须等待消息被处理完成才返回), 不能使用PostMessage(异步), 这样远远达不到实时要求. 测试了一下,发现大部分消息都只能采样同步方式发送, WM_CLEAR / WM_NOTIFYFORMAT / WM_USER / WM_DEVICECHANGE 等消息可以通过异步发送. 

  

   在不同进程之间传递一指针,各个进程其对应指针地址不同, 不可能取到相应字符串的值. 实际上WM_COPYDATA内部实现也用到共享内存, 那我们采用 windows消息通知 + 共享内存 来实现通知重装配置功能.

 

   2. windows 广播消息

/**
 * windows 下提供了强大的广播消息函数,可以向网络驱动,应用程序,安装的驱动,系统级设备及组件发送消息
 */
DWORD bsm_app=BSM_APPLICATIONS; // 向所有应用程序发送消息
BroadcastSystemMessage(BSF_POSTMESSAGE,&bsm_app,WM_NOTIFYFORMAT,NULL,NULL);

 

   3. windows下共享内存

   服务端:

#include <windows.h>
#include <stdio.h>

#define MY_MEMORY_ID "kettas"

int main(int argc,char **argv)
{
	/**
	 *  创建命名为kettas的共享内存
	 *  dwMaximumSizeLow 映射对象低位最大尺寸设置为0时, xp下创建失败,这里设置为1024
	 */ 
	HANDLE lhShareMemory = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,MY_MEMORY_ID);  
	if (lhShareMemory !=NULL)  
	{  
		printf("信息:共享数据打开失败");
		return 1;
	}  
	
	LPVOID buff;  
	buff = MapViewOfFile(lhShareMemory,FILE_MAP_WRITE,0,0,0); // 获取映射对象地址
	// strcpy(strBuffer,"hello kettas"); // 写入数据
	
	char *str="Hello world";
	CopyMemory((PVOID)buff,str,strlen(str)); // 写入数据

	UnmapViewOfFile((PVOID)buff);

	getchar();
	return 0;
}

   客户端:

#include <windows.h>
#include <stdio.h>

#define MY_MEMORY_ID "kettas"

int main(int argc,char **argv)
{
	HANDLE  handleFile;
	handleFile= OpenFileMapping(FILE_MAP_ALL_ACCESS,false,MY_MEMORY_ID); //打开共享文件
	if (handleFile==NULL)
	{
		printf("共享数据打开失败\n");
		return 1;
	}

	char * str = NULL;
	str=(char *) MapViewOfFile(handleFile,FILE_MAP_ALL_ACCESS,0,0,0); // 获取共享对象数据
	
	printf("结果:%s",str);
	
	UnmapViewOfFile(str);
	CloseHandle(handleFile);
	
	getchar();
	return 0;
}

 

  当配置发生改变时, 服务端将数据写入共享内存,然后广播通知其它进程去共享内存中获取相应数据. 对于QT控制台程序,利用上往篇讲的, 新建一窗口后隐藏即可

/**
 * @brief 获取广播消息
 * @parm  MRev 消息回调函数
 */ 
void GetNoticeMessage( MRev mRev )
{
	if(mRev==NULL)
	{
		printf("错误:回调函数为空\n");
		return;
	}

	// 全局指针赋值
	GRevHandler=mRev;

#ifdef WIN32
	hinstance = (HINSTANCE)GetModuleHandle(NULL);

	if (!InitApplication(hinstance)) 
	{
		printf("错误:注册窗口失败\n");
		return;
	}

	if (!InitInstance(hinstance, SW_HIDE)) // 隐藏窗口
	{
		printf("错误:新建窗口失败\n");
		return;
	}

#elif __unix
	// 安装消息
	InstallMessage();
#endif 
}

 

 

分享到:
评论

相关推荐

    Windows 进程间通信 - DDEML C/C++

    本篇将详细介绍如何使用DDEML库在C/C++环境中实现进程间通信,并通过`sdk_WinBase_IPC_ddeml_VS2008`中的示例代码进行解析。 DDEML基于动态数据交换(DDE,Dynamic Data Exchange)技术,它允许应用程序共享数据和...

    通过Windows窗口消息实现 QT进程间通信

    本篇文章将详细探讨如何在QT框架下利用Windows窗口消息来实现进程间通信。 首先,让我们了解什么是QT。QT是一个跨平台的应用程序开发框架,由Qt Company提供,广泛用于创建GUI应用程序。它提供了丰富的API和工具,...

    Windows进程间通信开篇

    本篇文章将深入探讨Windows进程间通信的基本概念、常用技术以及"kaipian"源码可能涉及的具体实现。 首先,我们要理解什么是进程。在Windows系统中,进程是执行中的程序实例,拥有自己的内存空间,每个进程都有独立...

    delphi进程间通信

    本篇文章将深入探讨如何在Delphi中实现进程间通信,特别是通过消息传递的两种方法。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。为了实现进程...

    VC进程通信-VS

    总结来说,"VC进程通信-VS"这一主题涵盖了Windows环境下使用Visual Studio进行进程间通信的各种技术和方法,包括管道、共享内存、消息队列、套接字和命名管道。通过学习这些内容,开发者可以提升在多进程应用开发中...

    MFC程序通过SendMessage或PostMessage实现进程间通信,实现很简单

    本篇文章将深入探讨如何使用MFC中的`SendMessage`和`PostMessage`函数来实现简单的进程间通信。 首先,`SendMessage`和`PostMessage`都是Windows API中处理消息的核心函数,它们都用于在窗口之间发送消息。但两者的...

    进程间通信_进程间通信_

    本篇文章将深入探讨C#中的几种主要的进程间通信机制,并以"发送方"和"接收方"的视角来阐述如何实现和注意事项。 1. 管道(Pipes) 管道是简单且高效的数据传输方式,分为匿名管道和命名管道。匿名管道适用于父子...

    进程间通信源码 vc++

    本篇文章将深入探讨使用VC++实现进程间通信的方法,特别是通过广播通信的实现。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。由于进程间的内存...

    C++共享内存进程间通信 demo

    本篇将深入讲解C++中使用File Mapping进行进程间通信的示例。 共享内存是IPC方法之一,它通过让多个进程共享一块在内存中的特定区域来实现通信。相比于其他通信机制如管道、套接字或消息队列,共享内存具有更高的...

    进程间通信——匿名管道

    进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的机制,允许不同的进程之间交换数据,协同工作。在各种IPC方法中,匿名管道是一种简单且古老的通信方式,尤其适用于父子进程之间的通信。本篇...

    进程间消息通知方式通信

    在Windows操作系统中,进程间通信(IPC,Inter-Process Communication)允许不同进程共享数据、同步执行以及交换信息。本篇将详细介绍使用`RegisterWindowMessage`函数实现进程间消息通知的原理和步骤。 `...

    Delphi 10.4 进程间通信

    本篇文章将深入探讨如何在Delphi 10.4中通过`CopyDataStruct`实现进程间通信,以及需要注意的关键点。 首先,让我们理解什么是`CopyDataStruct`。在Windows API中,`CopyDataStruct`是一个结构体,用于在不同进程中...

    进程间通信技术在系统集成中的应用.pdf

    《进程间通信技术在系统集成中的应用》这篇文章探讨了如何在系统集成中利用Windows平台的进程间通信(Inter-Process Communication, IPC)技术,实现图形用户界面(GUI)与控制台程序之间的数据交换。进程间通信是多...

    跨进程通信SendMessage - C#

    同时,由于涉及到进程间的通信,需要注意同步问题,以防止数据冲突和资源竞争。 通过学习和实践如何在C#中使用`SendMessage`,开发者能够更好地理解和控制Windows应用程序的交互,这对于开发系统工具、自动化脚本...

    命名管道实现进程间通信示例程序

    命名管道是Windows操作系统中一种进程间通信(IPC,Inter-Process Communication)的技术,它允许不同进程之间通过共享数据流进行通信。在这个示例程序中,我们将会深入理解命名管道的工作原理以及如何在C++或其他...

    Delphi进程间通讯

    6. **邮件槽(Mail Slots)**:邮件槽是Windows提供的一种轻量级的进程间通信机制,允许一个进程向多个其他进程广播消息。 7. **远程过程调用(Remote Procedure Calls, RPC)**:RPC使得一个进程能够调用另一个...

    易语言源码进程相关模块-1.7z

    3. 进程通信:易语言提供了多种方式实现进程间的通信,如管道、共享内存、消息队列等,这些都是多线程或多进程编程中的重要手段。 4. 进程信息获取:获取进程ID、进程名、优先级、内存使用情况等,对于监控和调试...

    C#进程间通讯

    本篇将重点讨论通过发送消息和共享内存这两种方式进行C#进程间通信。 首先,我们来看发送消息的方式。在C#中,这通常通过.NET框架提供的`System.Messaging`命名空间中的Message Queuing(MSMQ)技术来实现。MSMQ是...

    VC下使用共享内存进行进程间的通信

    在Windows操作系统中,进程间通信(IPC,Inter-Process Communication)是不同进程之间交换数据的一种方式。VC++作为Microsoft Visual Studio的一部分,提供了丰富的API供开发者实现进程间通信。本篇文章将详细探讨...

    共享内存,进程通信,进程同步 代码

    共享内存是操作系统中进程间通信(IPC,Inter-Process Communication)的一种有效机制,它允许不同的进程访问同一块存储区域,从而实现数据的快速交换。在Windows系统中,Visual Studio 2005提供了丰富的API来支持...

Global site tag (gtag.js) - Google Analytics