【问题标题】:Shared bitmap across processes跨进程共享位图
【发布时间】:2012-01-31 16:07:29
【问题描述】:

如何使用win32/mfc在windows中创建一个设备独立的位图,该位图将在机器上运行的所有进程之间共享?

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

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

请在时间复杂度和空间复杂度方面提出最佳方法。空间复杂度是指,想要在这个位图上绘制内容的进程不应该需要复制本地内存上的所有内容并进行绘制,它应该可以直接在设备上下文中获取该位图并在位图中进行绘制。

【问题讨论】:

    标签: windows winapi mfc gdi


    【解决方案1】:

    很遗憾*,不支持在进程之间共享 GDI 句柄(例如位图)的方式。

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

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

    您有几种方法可以让各个进程的节句柄 -

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

    无论如何,您可以在每个进程中调用CreateDIBSection 来创建由同一内存部分支持的 GDI 位图。请注意有关同步访问位图的 cmets。如果您有多个进程尝试写入位图,您可能需要在该级别序列化访问。

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

    【讨论】:

    • 您可能应该提到 CreateFileMapping 的 lpName 参数,可用于 OpenFileMapping 以简化共享。
    • 感谢您提醒我简单的方法。有时我可能是个 idjit。
    • 如何将相同的缓冲区传递给每个进程中的 CreateDIBSection 调用。
    • 通过使用 CreateFileMapping 和 OpenFileMapping 返回的句柄。只要所有文件映射都引用同一个(命名的)对象,底层存储将是相同的物理字节。
    • 谢谢克里斯..我喜欢这个想法..你有工作示例的链接吗...这对我有用..
    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2020-05-10
    • 2010-11-29
    • 2012-09-19
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多