1

我在一个COMCTL32.DLL加载了两次的进程中运行,一次使用版本 5.82.7601.17514,一次使用版本 6.10.7601.17514。旧版本由程序链接的某个旧 DLL 加载,而另一个版本由较新的 DLL 加载。

如果我使用GetModuleHandle (L"COMCTL32.DLL")我无法控制得到解决的 DLL。

GetProcAddress例如,当我调用reach 时TaskDialogIndirect,我得到一个空指针,这肯定是因为我得到了遗留DLL 的句柄。

那么,是否有一些方法可以获取地址,比如TaskDialogIndirect加载两个 DLL 时。

如果没有,我是否可以确保进程加载 6.10 版本而不是 5.82,希望我们的旧版 DLL 可以在较新版本的COMCTL32?

4

1 回答 1

5

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

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

  1. 使用隐式链接,但使用 MS 工具链支持的延迟加载。我不能 100% 确定这会给你正确的 comctl32,但值得一试。
  2. 使用激活上下文 API确保 comctl32 v6 清单在您调用LoadLibrary(). 打电话LoadLibrary()而不是GetModuleHandle()确保你得到了显化的魔法。
  3. 枚举进程中的所有模块,选择正确的comctl32版本。MSDN 上有一个关于如何执行此操作的综合示例

激活上下文方法是最干净的解决方案,但是激活上下文 API 可能很难进入。我个人使用它来确保 Excel COM 加载项链接到 comctl32 v6。

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

于 2011-08-31T16:28:09.840 回答