我可以在一个进程中加载​​多个COMCTL32.dll吗?

时间:2009-06-09 17:30:17

标签: winforms activex winforms-interop

我正在开发一个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加载到内存中。

This webpage涵盖了使用COMCTL32 6.0的一些场景,但不包括我所处的情况。

2 个答案:

答案 0 :(得分:2)

最初的MSDN文章令我困惑,因为它专注于一些特定的场景,其中没有一个与我的相匹配。事实上,它所谈论的基础技术更为普遍。

通过adding a 'manifest' xml file资源到ActiveX DLL,我可以向并排系统发出信号,我希望该DLL使用COMCTL32.DLL 6.x.然后自动加载该版本。非常好。

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

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

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

答案 1 :(得分:0)

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