跨进程共享位图

如何在Windows中使用win32 / mfc在机器上运行的所有进程之间共享设备独立位图?

寻找在Windows XP / 7机器上的所有进程之间共享DIB的最佳和最快的方式。 进程应该能够locking位图的内容并在该位图上绘制,其他进程也可以使用该位图进行读取。

例如,最初这个DIB将由主应用程序创build。 当其他进程想要在此进程上绘制某些东西时,可以locking此DIB的内容并在此位图上绘制。 如果其他进程想要读取该位图的内容,则可以locking位图并读取位图。

请在时间复杂性和空间复杂性方面提出一个最好的方法。 空间复杂度意味着,想要在该位图上绘制内容的过程不需要复制本地内存上的所有内容并绘制,应该直接在设备上下文中将此位图绘制到位图中。

不幸的是,不支持在进程间共享GDI句柄(比如位图)。

有一个受支持的方式来获取多个位图(在多个进程中)共享相同的存储。

在主进程中,使用CreateFileMapping API创建一个内存部分。

你有几种方法来得到你的各个进程的部分句柄 –

其中最简单的(正如Hans Passant所指出的)只是在调用CreateFileMapping …时命名该段,然后使用OpenFileMapping。 如果您有一个启动其他进程的主进程,请确保使用SECURITY_ATTRIBUTES的bInheritHandle设置为TRUE来创建该部分,并且该句柄将自动复制到任何子进程中 – 通常将其句柄传递给新的过程。 否则,使用DuplicateHandle函数将句柄复制到其他进程中 – 但是您仍然需要其他类型的IPC来获取进程的句柄。

然而,它发生 – 你可以在每个进程调用CreateDIBSection来创建GDI位图由同一内存部分支持。 请注意关于同步对位图的访问的注释。 如果您有多个进程尝试写入位图,则可能需要对该级别的访问进行序列化。

  • 讽刺的是:由于Win32基于Win16,因此有许多Win16传统API处理窗口消息,而剪贴板实际上希望HBITMAP可以在多个进程中使用。 此外,Windows NT 5.x和6.x位图上的(作为实现细节)由内核模式驱动程序从单个系统范围的句柄表中分配,因此在任何进程中在技术上都是有效的 – 但是,GDI还存储每个进程的进程ID该表中的GDI对象和GDI API调用显式检查进程ID,并在属于另一进程的GDI句柄上调用时失败。