WinForms 应用程序无法成功导入从 MFC 应用程序导出的图像

WinForms apps can not successfully import images exported from MFC apps

简介及相关信息:

我们有用 C++ 编写的 MFC OCX 控件,可以将图像导出到压缩的 MFC CArchive(使用 ZLib 压缩存档)。
OCX 控件还可以导入那些导出的图像(用 ZLib 将它们解压缩到 CArchive,然后在其客户区渲染 CArchive)。
它用于几个关键应用程序,一些用 MFC 编写,一些用 WinForms 编写。

问题:

WinForms 应用程序无法成功导入从 MFC 应用程序导出的图像。
将从 WinForms 导出的图像导入 MFC 工作正常。
从 MFC 导出并导入回 MFC 工作正常。
从 WinForms 导出并重新导入 WinForms 工作正常。

MVCE:

我制作了小型演示 OCX 控件以及小型 MFC 和 WinForms 使用者来说明问题。
GitHub link 是 here.

我的努力:

调试显示 DemoOCX 应用程序中的 ReadImagesFromCArchive(...) 调用失败,更具体地说 CImageList::Read(...)
可悲的是,我找不到调试 CImageList::Read(...).
的方法 我试图弄清楚 Read 是如何在引擎盖下工作的,并偶然发现了 this
在 DemoOCX 和消费者应用程序中启用视觉样式后,一切正常。

尽管在实际应用中启用视觉样式并没有解决问题。
WinForms 应用程序有很多第 3 方组件,主要是 OCX。其中一些仍然具有旧的外观。

问题:

  1. 有没有办法重写 DemoOCX 中的代码,从而不需要启用视觉样式?

    如果有,请教我怎么做?

  2. 如果你能提供上述方法的替代方案,我会接受。

    因为我不知道如何开始解决这个问题,所以我对一切都持开放态度和感激之情。

注意:这更像是一个扩展评论而不是一个答案,但是当我尝试你的链接项目时产生了几个构建错误,我放弃了修复所有问题的尝试问题以确认是否是以下问题。

I have tried to figure out how Read works under the hood and stumbled upon this.

您误解了以下内容的意图:

ImageList_WriteEx function (commctrl.h)-Remarks

To use ImageList_WriteEx, the application must specify Comctl32.dll version 6 in the manifest. For more information on manifests, see Enabling Visual Styles.

这并不意味着您需要启用视觉样式,而是您的项目需要一个指定使用 Comctl32.dll 版本 6 的清单文件,并且“启用视觉样式”文档说明了如何创建清单.

在OCXTesterCS项目中,添加清单文件(项目菜单->添加新项->Select“Application Manifest File (Windows Only)”;接受默认名称“app.manifest").

在此文件的末尾,您将找到此块:

  <!--
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="6595b64144ccf1df"
          language="*"
        />
    </dependentAssembly>
  </dependency>
  -->

删除环绕注释标签(<!---->)以启用并保存文件。