【发布时间】: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。其中一些仍然具有旧的外观和感觉。
问题:
-
有没有办法重写 DemoOCX 中的代码,因此不需要启用视觉样式?
如果有,请教我怎么做?
-
如果您可以提供上述方法的替代方案,我会接受。
因为我不知道如何开始解决这个问题,所以我对一切都持开放态度和感激之情。
【问题讨论】:
-
CImageList::Read 是 MFC 的一部分。 Visual Studio 附带 MFC 源代码,以便您可以对其进行调试。您可能必须禁用Enable Just My Code 调试器选项。如果这不起作用,请在您拨打电话时切换到拆卸,然后单步执行。然后您可以切换回源视图。
-
@IInspectable:我以前从未使用过反汇编。在我按照您的建议报告我得到的结果之前,我会尝试找到一些教程。谢谢你的建议。
-
尝试在github上放一个可编译的项目,目前的问题太多,无法测试,无需花费太多时间。