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

WinForms应用无法成功导入从MFC应用导出的图像,winforms,mfc,zlib,ocx,Winforms,Mfc,Zlib,Ocx,导言和有关资料: 我们有C++编写的MFC OCX控件,将图像导出到压缩的MFC代码> CARCHIVI/(用ZLib压缩存档)。 OCX控件还可以导入这些导出的图像(使用ZLib将它们解压缩到CArchive,然后在其客户端区域上呈现CArchive。 它用于几个关键的应用程序,有些是用MFC编写的,有些是用WinForms编写的。 问题: WinForms应用无法成功导入从MFC应用导出的图像。 将从WinForms导出的图像导入MFC工作正常。 从MFC导出并导入回MFC工作正常。 从Wi

导言和有关资料:

我们有C++编写的MFC OCX控件,将图像导出到压缩的MFC代码> CARCHIVI/<代码>(用ZLib压缩存档)。 OCX控件还可以导入这些导出的图像(使用ZLib将它们解压缩到

CArchive
,然后在其客户端区域上呈现
CArchive

它用于几个关键的应用程序,有些是用MFC编写的,有些是用WinForms编写的。

问题:

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

MVCE:

我制作了小的演示OCX控件和小的MFC和WinForms使用者,以说明问题。
GitHub链接是。

我的努力:

调试表明,DemoOCX应用程序中的
ReadImagesFromCArchive(…)
调用失败,更具体地说
CImageList::Read(…)

遗憾的是,我没有找到调试到
CImageList::Read(…)

的方法 我曾试图弄清楚
阅读
在引擎盖下是如何工作的,但我无意中发现了。
在DemoOCX和消费者应用程序中启用视觉样式后,一切正常。

不过,在实际应用程序中启用视觉样式并不能解决此问题。
WinForms应用程序有很多第三方组件,主要是OCX。其中一些仍然有旧的外观和感觉。

问题:

  • 是否有办法在DemoOCX中重写代码,从而不需要启用视觉样式

    如果有,你能告诉我怎么做吗

  • 如果你能提供上述方法的替代方案,我将接受

    由于我不知道如何着手解决这个问题,我对一切都持开放态度,并表示感谢


  • 注意:这与其说是一个答案,不如说是一个扩展的评论,但当我尝试它时,您的链接项目产生了几个构建错误,我放弃了尝试修复所有问题以确认是否存在以下问题

    我曾试图弄清楚里德是如何在引擎盖下工作的,但我无意中发现了这一点

    您误解了以下意图:

    要使用ImageList_WriteEx,应用程序必须在清单中指定Comctl32.dll版本6。有关清单的详细信息,请参见启用视觉样式

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

    在OCXTesterCS项目中,添加清单文件(项目菜单->添加新项->选择“应用程序清单文件(仅限Windows)”;接受默认名称“app.manifest”)

    在本文件末尾,您将发现以下块:

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

    删除包装注释标记(
    )以启用并保存文件。

    是MFC的一部分。VisualStudio附带MFC源代码,以便您可以调试到其中。您可能必须禁用调试器选项。如果这不起作用,当你打电话时,切换到反汇编,并进入它。然后可以切换回源代码视图。@IInspectable:我以前从未使用过反汇编。在我报告在遵循您的建议后得到的内容之前,我将尝试查找一些教程。谢谢你的建议。试着把一个可编译的项目放在github上,当前的项目有太多的问题要测试,没有花太多的时间。谢谢你,投票通过并获得了赏金。问候,直到下次!:)