使用MFC的跨进程GDI绘图

Cross process GDI Drawing using MFC

本文关键字:GDI 绘图 进程 MFC 使用      更新时间:2023-10-16

我有一个巨大的MFC MDI应用程序,它使用设备上下文绘制其可滚动视图区域。这个应用程序使用第三方库在相同的视图区域做一些额外的绘图。它的工作原理是通过将视图区域的DC(设备上下文)传递给这个第三方库(dll),然后dll做额外的绘图,这是相当复杂的。

然而,我们正在将整个应用程序转换为64位,问题是我们没有这个第三方库的64位版本。这让我们只有一个选择,那就是把这个第三方库移动到一个单独的进程中,然后在我们的主应用程序和托管这个第三方库的新进程之间进行进程外调用。

但是现在,我们如何进行跨流程绘图呢?是否有任何方法可以使用普通的GDI或MFC来做这些事情?

这个答案说你不能把HDC从一个进程传递到另一个进程。

你可以这样做:

  1. 在DC上发布GetDIBits以获得原始位图位。
  2. 通过使用某种形式的IPC将这些移动到32位进程。
  3. 使用SetDIBits将它们放入另一个进程的内存DC中。
  4. 允许第三方库与DC进行交互。
  5. 做同样的反向操作以获得比特。

对于IPC,我建议简单地将一块共享内存映射到两个进程中。性能可能会很差,但你应该能应付过去。

我相信Google Chrome做了类似的事情,将渲染引擎与单个选项卡隔离开来。