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

Pie*_*aud 1 dll winapi comctl32 loadlibrary

我在一个COMCTL32.DLL加载两次的进程内运行,一次使用版本5.82.7601.17514,一次使用版本6.10.7601.17514.旧版本由程序链接的一些遗留DLL加载,另一个版本由较新的DLL加载.

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

GetProcAddress例如,当我调用到达时,TaskDialogIndirect我得到一个空指针,这当然是因为我找回了遗留DLL的句柄.

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

如果没有,我可以以某种方式确保该进程加载6.10版本而不是5.82,希望我们的旧版DLL能够在较新版本的情况下正常运行COMCTL32吗?

Dav*_*nan 5

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

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

  1. 使用隐式链接,但使用MS工具链支持的延迟加载.我不是百分之百肯定会给你正确的comctl32但是值得一试.
  2. 使用激活上下文API确保在调用时comctl32 v6清单正在播放中LoadLibrary().打电话LoadLibrary()而不是GetModuleHandle()确保你获得明显的魔力.
  3. 枚举流程中的所有模块,并选择正确的comctl32版本.有一个关于如何在MSDN上执行此操作综合示例.

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

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