需求如下: 当配置文件发生改变时,广播配置信息给所有的进程,通知其重装配置.
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 }
相关推荐
本篇将详细介绍如何使用DDEML库在C/C++环境中实现进程间通信,并通过`sdk_WinBase_IPC_ddeml_VS2008`中的示例代码进行解析。 DDEML基于动态数据交换(DDE,Dynamic Data Exchange)技术,它允许应用程序共享数据和...
本篇文章将详细探讨如何在QT框架下利用Windows窗口消息来实现进程间通信。 首先,让我们了解什么是QT。QT是一个跨平台的应用程序开发框架,由Qt Company提供,广泛用于创建GUI应用程序。它提供了丰富的API和工具,...
本篇文章将深入探讨Windows进程间通信的基本概念、常用技术以及"kaipian"源码可能涉及的具体实现。 首先,我们要理解什么是进程。在Windows系统中,进程是执行中的程序实例,拥有自己的内存空间,每个进程都有独立...
本篇文章将深入探讨如何在Delphi中实现进程间通信,特别是通过消息传递的两种方法。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。为了实现进程...
总结来说,"VC进程通信-VS"这一主题涵盖了Windows环境下使用Visual Studio进行进程间通信的各种技术和方法,包括管道、共享内存、消息队列、套接字和命名管道。通过学习这些内容,开发者可以提升在多进程应用开发中...
本篇文章将深入探讨如何使用MFC中的`SendMessage`和`PostMessage`函数来实现简单的进程间通信。 首先,`SendMessage`和`PostMessage`都是Windows API中处理消息的核心函数,它们都用于在窗口之间发送消息。但两者的...
本篇文章将深入探讨C#中的几种主要的进程间通信机制,并以"发送方"和"接收方"的视角来阐述如何实现和注意事项。 1. 管道(Pipes) 管道是简单且高效的数据传输方式,分为匿名管道和命名管道。匿名管道适用于父子...
本篇文章将深入探讨使用VC++实现进程间通信的方法,特别是通过广播通信的实现。 首先,我们要理解什么是进程。在操作系统中,进程是程序执行时的一个实例,每个进程都有自己的内存空间和系统资源。由于进程间的内存...
本篇将深入讲解C++中使用File Mapping进行进程间通信的示例。 共享内存是IPC方法之一,它通过让多个进程共享一块在内存中的特定区域来实现通信。相比于其他通信机制如管道、套接字或消息队列,共享内存具有更高的...
进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的机制,允许不同的进程之间交换数据,协同工作。在各种IPC方法中,匿名管道是一种简单且古老的通信方式,尤其适用于父子进程之间的通信。本篇...
在Windows操作系统中,进程间通信(IPC,Inter-Process Communication)允许不同进程共享数据、同步执行以及交换信息。本篇将详细介绍使用`RegisterWindowMessage`函数实现进程间消息通知的原理和步骤。 `...
本篇文章将深入探讨如何在Delphi 10.4中通过`CopyDataStruct`实现进程间通信,以及需要注意的关键点。 首先,让我们理解什么是`CopyDataStruct`。在Windows API中,`CopyDataStruct`是一个结构体,用于在不同进程中...
《进程间通信技术在系统集成中的应用》这篇文章探讨了如何在系统集成中利用Windows平台的进程间通信(Inter-Process Communication, IPC)技术,实现图形用户界面(GUI)与控制台程序之间的数据交换。进程间通信是多...
同时,由于涉及到进程间的通信,需要注意同步问题,以防止数据冲突和资源竞争。 通过学习和实践如何在C#中使用`SendMessage`,开发者能够更好地理解和控制Windows应用程序的交互,这对于开发系统工具、自动化脚本...
命名管道是Windows操作系统中一种进程间通信(IPC,Inter-Process Communication)的技术,它允许不同进程之间通过共享数据流进行通信。在这个示例程序中,我们将会深入理解命名管道的工作原理以及如何在C++或其他...
6. **邮件槽(Mail Slots)**:邮件槽是Windows提供的一种轻量级的进程间通信机制,允许一个进程向多个其他进程广播消息。 7. **远程过程调用(Remote Procedure Calls, RPC)**:RPC使得一个进程能够调用另一个...
3. 进程通信:易语言提供了多种方式实现进程间的通信,如管道、共享内存、消息队列等,这些都是多线程或多进程编程中的重要手段。 4. 进程信息获取:获取进程ID、进程名、优先级、内存使用情况等,对于监控和调试...
本篇将重点讨论通过发送消息和共享内存这两种方式进行C#进程间通信。 首先,我们来看发送消息的方式。在C#中,这通常通过.NET框架提供的`System.Messaging`命名空间中的Message Queuing(MSMQ)技术来实现。MSMQ是...
在Windows操作系统中,进程间通信(IPC,Inter-Process Communication)是不同进程之间交换数据的一种方式。VC++作为Microsoft Visual Studio的一部分,提供了丰富的API供开发者实现进程间通信。本篇文章将详细探讨...
共享内存是操作系统中进程间通信(IPC,Inter-Process Communication)的一种有效机制,它允许不同的进程访问同一块存储区域,从而实现数据的快速交换。在Windows系统中,Visual Studio 2005提供了丰富的API来支持...