【问题标题】:WinForms apps can not successfully import images exported from MFC appsWinForms 应用程序无法成功导入从 MFC 应用程序导出的图像
【发布时间】:2021-03-16 13:06:36
【问题描述】:

简介及相关信息:

我们有用 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 链接是here

我的努力:

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

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

问题:

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

    如果有,请教我怎么做?

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

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

【问题讨论】:

  • CImageList::Read 是 MFC 的一部分。 Visual Studio 附带 MFC 源代码,以便您可以对其进行调试。您可能必须禁用Enable Just My Code 调试器选项。如果这不起作用,请在您拨打电话时切换到拆卸,然后单步执行。然后您可以切换回源视图。
  • @IInspectable:我以前从未使用过反汇编。在我按照您的建议报告我得到的结果之前,我会尝试找到一些教程。谢谢你的建议。
  • 尝试在github上放一个可编译的项目,目前的问题太多,无法测试,无需花费太多时间。

标签: winforms mfc zlib ocx


【解决方案1】:

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

我试图弄清楚 Read 是如何在幕后工作的,结果偶然发现了 this

您误解了以下意图:

ImageList_WriteEx function (commctrl.h)-Remarks

要使用 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>
  -->

删除包装注释标签(&lt;!----&gt;)以启用和保存文件。

【讨论】:

  • 谢谢你,支持并获得赏金。问候,直到下一次! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2011-03-27
  • 2012-02-29
  • 2020-08-13
相关资源
最近更新 更多