【发布时间】:2011-08-31 16:14:56
【问题描述】:
我在一个进程中运行,其中COMCTL32.DLL 被加载了两次,一次使用版本 5.82.7601.17514,一次使用版本 6.10.7601.17514。旧版本由程序链接的某个旧 DLL 加载,而另一个版本由较新的 DLL 加载。
如果我使用GetModuleHandle (L"COMCTL32.DLL"),我将无法控制解析的 DLL。
当我调用GetProcAddress 以访问例如TaskDialogIndirect 时,我得到一个空指针,这肯定是因为我得到了旧版DLL 的句柄。
那么,当两个 DLL 都被加载时,是否有一些方法可以获取地址,比如 TaskDialogIndirect。
如果没有,我能否以某种方式确保进程加载 6.10 版本而不是 5.82,希望我们的旧版 DLL 可以与较新版本的 COMCTL32 一起正常工作?
【问题讨论】:
-
一个可能的快速修复方法是在 Visual Studio 中使用 File + Open + File 打开 DLL 的副本并删除清单资源。
-
最后,我们通过添加清单而不是删除清单来确保应用程序使用 2new" 外观来解决此问题。但是,新外观 (COMCTL32 v6) 存在一些兼容性问题。
标签: winapi dll loadlibrary comctl32