COMCTL32.DLL加载两次时的GetModuleHandle和GetProcAddress

时间:2011-08-31 16:14:56

标签: winapi dll loadlibrary comctl32

我在一个加载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一起使用吗?

1 个答案:

答案 0 :(得分:5)

我想您必须使用GetProcAddress()而不是隐式链接,因为您希望您的应用在XP上运行,其中任务对话框不可用。

我可以为您看到三个选项:

  1. 使用隐式链接,但使用MS工具链支持的延迟加载。我不是百分之百肯定会给你正确的comctl32但是值得一试。
  2. 使用activation context API确保在致电LoadLibrary()时comctl32 v6清单正在播放中。请致电LoadLibrary()而不是GetModuleHandle(),以确保您获得清单魔法。
  3. 枚举流程中的所有模块,并选择正确版本的comctl32。有一个comprehensive example of how to do this on MSDN
  4. 激活上下文方法是最干净的解决方案,但激活上下文API可能很难进入。我个人已经用它来确保Excel COM加载项链接到comctl32 v6。

    模块枚举方法很快实现,有点脏,但效果很好。