我正在开发一个 ActiveX 控件(目前)主要在 WinForms 应用程序中使用。

ActiveX 控件有一个“属性页”对话框,可以使用 AxHost 类上的 ShowPropertyPages 方法以编程方式显示该对话框。这是可以在 Visual Studio 中打开以编辑控件属性的自定义 UI。

此属性页对话框包含一个 ListBox 控件,该控件使用 ImageList 在列表项旁边显示图标。这些图标是 32 位 alpha 混合位图。为了使这些能够正确显示,版本 6.0 必须使用 COMCTL32.DLL 或以上版本。

不幸的是,当我运行我的 WinForms 应用程序时,它加载并使用 COMCTL32.DLL 版本 5.xxx. 。因此,当显示属性页对话框时,图标看起来很糟糕(半透明区域以纯黑色绘制)。

我的问题是:有什么方法可以确保在 ActiveX 控件的属性页 UI 中使用 COMCTL32.dll 版本 6.0+,无论进程使用什么?或者我可以强制主机进程使用6.0版本吗?(我认为不是,因为我认为主机进程可能已经在 ActiveX 控件中的任何代码之前将 COMCTL32.DLL 加载到内存中。

这个网页 涵盖了使用 COMCTL32 6.0 的一些场景,但不是我所处的情况。

有帮助吗?

解决方案

最初的 MSDN 文章让我感到困惑,因为它专注于许多特定场景,但没有一个与我的场景相符。事实上,它所谈论的底层技术的工作原理更为普遍。

经过 添加“清单”xml 文件 资源到 ActiveX DLL,我可以向并行系统发出信号,表明我希望该 DLL 使用 COMCTL32.DLL 6.x。然后会自动加载该版本。很不错。

该清单需要是资源类型 RT_MANIFEST, ,资源 ID 为 2.

这是成功的证据(同一进程中加载​​了同一 DLL 的两个版本!):procexp screenshot showing two COMCTL32's loaded in process

(此外,图标在列表框中正确显示 ;))

其他提示

如果应用程序调用Application.EnableVisualStyles()(典型地调用Application.Run()来启动一个消息循环之前),则库应当使用的公共控件6+版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top