2012-01-02 94 views
2

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

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

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

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

回答

3

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

但是有一种支持的方式可以获得多个位图(在多个进程中)共享相同的存储。

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

您可以通过多种方式来获得部分手柄的各种过程 -

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

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

  • 作为一个具有讽刺意味的说明:由于Win32的是基于Win16的也有很多,与窗口消息,并期望HBITMAP的是从多个进程使用那些实际上剪贴板处理Win16的传统的API。此外,Windows NT 5.x和6.x位图上的(作为实现细节)由内核模式驱动程序从单个系统范围的句柄表中分配,因此在任何进程中都是技术上有效的 - 但是,GDI也会存储每个进程的进程ID该表中的GDI对象和GDI API调用显式检查进程ID,如果在属于另一进程的GDI句柄上调用,则会失败。
+1

您可能应该提及CreateFileMapping的lpName参数,可在OpenFileMapping中使用,以使分享变得简单。 – 2012-01-02 13:40:45

+0

感谢您提醒我简单的方法。有时候我可以成为一个idjit。 – 2012-01-02 14:43:57

+0

如何在每个进程中将相同的缓冲区传递给CreateDIBSection的每个调用。 – vicky 2012-01-03 14:22:02