我可以将多个 COMCTL32.dll 加载到一个进程中吗?
我正在开发一个 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 的一些场景,但不是我所处的情况。
I'm developing an ActiveX control which (these days) is used mostly in WinForms apps.
The ActiveX control has a 'property page' dialog, which can be shown programmatically using the ShowPropertyPages method on the AxHost class. This is the custom UI that can be brought up in Visual Studio to edit a control's properties.
This property page dialog contains a ListBox control which uses an ImageList to display icons next to list items. These icons are 32-bit alpha-blended bitmaps. In order for these to display properly, version 6.0 or above of COMCTL32.DLL must be used.
Unfortunately when I run my WinForms app, it loads and uses COMCTL32.DLL version 5.xxx. As a result, when the property page dialog is displayed the icons look bad (the semi-transparent areas are drawn in solid black).
My question is: is there any way I can make sure to use COMCTL32.dll version 6.0+ from within the ActiveX control's property page UI, regardless of what the process is using? Or can I force the host process to use version 6.0? (I think not, because I am thinking the host process might have already loaded COMCTL32.DLL into memory before any of the code in the ActiveX control.
This webpage covers some scenarios for using COMCTL32 6.0, but not the situation I am in.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最初的 MSDN 文章让我感到困惑,因为它专注于许多特定场景,但没有一个与我的场景相符。 事实上,它所谈论的底层技术的工作原理更为普遍。
通过向 ActiveX DLL 添加“manifest”xml 文件资源,我可以向并行系统发出信号,表明我希望该 DLL 使用 COMCTL32.DLL 6.x。 然后会自动加载该版本。 很不错。
此清单的资源类型必须为 RT_MANIFEST,资源 ID 为 2。
这是成功的证据(同一进程中加载了同一 DLL 的两个版本!):
(此外,图标在列表框中正确显示 ;))
The original MSDN article was confusing me because it focussed on a number of specific scenarios, none of which matched mine. In fact, the underlying technology it is talking about works more generally.
By adding a 'manifest' xml file resource to the ActiveX DLL, I can signal to the side-by-side system that I want that DLL to use COMCTL32.DLL 6.x. That version is then loaded automatically. Pretty nice.
This manifest needs to be resource type RT_MANIFEST, with a resource ID of 2.
Here's the evidence of success (two versions of the same DLL loaded in the same process!):
(also, the icons display properly in the listbox ;))
如果您的应用程序调用 Application.EnableVisualStyles() (通常在调用 Application.Run() 启动消息循环之前),则应使用 6+ 版本的通用控件库。
If your application calls Application.EnableVisualStyles() (typically before calling Application.Run() to start a message loop) then version 6+ of the common controls library should be used.