【发布时间】:2010-12-17 13:19:59
【问题描述】:
我正在编译由多个.o 文件组成的自己的DLL。 .o 文件之一具有调用 SHLoadLibraryFromItem 的函数,该函数仅在 Windows 7 上受支持。除非使用 DLL 的应用程序在 Windows 7 上运行,否则永远不会调用该函数。(是的,我确定。)
但是,当在旧版本的 Windows(例如 XP)上运行应用程序时,整个应用程序在启动时会崩溃并出现错误“找不到指定的过程”。虽然错误没有指定找不到哪个过程,但如果我注释掉对SHLoadLibraryFromItem的调用,那么一切正常。
问题:
- 为什么 Windows 试图找到
SHLoadLibraryFromItem,即使它没有在 XP 上被调用? - 有没有办法让 Windows不这样做,即仅在运行 Windows 7 时才找到
SHLoadLibraryFromItem,即某种惰性绑定? - 如果不是,最好的解决方法是什么?
我能想到的唯一方法是:
- 使用
LoadLibrary加载SHLoadLibraryFromItem所在的Windows DLL,使用GetProcAddress手动获取地址到函数指针中,改用指针调用SHLoadLibraryFromItem? - 有两个 DLL:一个包含 Windows 7 支持的函数,只有在 Windows 7 上运行时才会加载。
还有其他想法吗?我真的更喜欢上面提到的某种惰性绑定。
更新
请阅读我实际写的内容。我在第一段中明确指出, SHLoadLibraryFromItem 是不调用的,除非我确定该应用程序实际上是在 WINDOWS 7 上运行的。
仅当 DLL加载时应用程序崩溃。
【问题讨论】: