2

我正在开发一个 ActiveX 控件,它(这些天)主要用于 WinForms 应用程序。

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

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

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

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

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

4

2 回答 2

2

最初的 MSDN 文章让我感到困惑,因为它专注于一些特定的场景,没有一个与我的匹配。事实上,它所谈论的底层技术更普遍。

通过将“清单”xml 文件资源添加到 ActiveX DLL,我可以向并行系统发出信号,我希望该 DLL 使用 COMCTL32.DLL 6.x。然后自动加载该版本。挺好的。

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

这是成功的证据(在同一个进程中加载​​了同一个 DLL 的两个版本!): procexp 屏幕截图显示两个 COMCTL32 在进程中加载

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

于 2009-06-10T08:59:52.273 回答
0

如果您的应用程序调用 Application.EnableVisualStyles()(通常在调用 Application.Run() 以启动消息循环之前),则应使用版本 6+ 的公共控件库。

于 2009-06-09T17:40:25.793 回答