跨进程共享位图

时间:2012-01-02 07:17:12

标签: windows winapi mfc gdi

如何使用win32 / mfc在Windows中创建与设备无关的位图,该位图将在机器上运行的所有进程之间共享?

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

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

请以时间复杂度和空间复杂性的方式建议最佳方式。空间复杂性意味着,想要在该位图上绘制内容的过程不需要复制本地存储器上的所有内容并绘制,它应该能够直接在设备上下文中获取该位图并在位图中绘制。

1 个答案:

答案 0 :(得分:3)

遗憾的是*,没有受支持的方法在进程之间共享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句柄上调用则失败。