我正在编写一个C++ Windows桌面应用程序,它使用延迟加载的DLL来支持具有不同功能的DLL的不同版本。
如果我的目标是Windows 10和更高版本,我可以使用函数QueryOptionalDelayLoadedAPI
来判断函数是否可用。不幸的是,我还需要针对Windows 7,并且QueryOptionalDelayLoadedAPI
在那里不可用。
还有什么方法可以用来检测Windows 7中可用的延迟加载函数?
edit:为了清楚起见,我需要检查函数是否可用,而不尝试调用它。
1条答案
按热度按时间7kjnsjlb1#
在这种情况下,如果没有实际调用函数,您唯一的选择就是通过
LoadLibrary/Ex()
将DLL加载到内存中,然后使用GetProcAddress()
获取指向所需函数的指针。如果其中一个失败,则函数不可用。如果两个都成功,则您将拥有一个指针,如果需要,可以使用该指针调用函数。这基本上是延迟加载机制在内部所做的全部工作(除了它的通知钩子)。
你可以做的是将这个逻辑 Package 到你自己的函数中,然后延迟加载
QueryOptionalDelayLoadedAPI()
本身,使用一个失败钩子来告诉你什么时候QueryOptionalDelayLoadedAPI()
不可用,这样你就可以将它Map到你的自定义函数。这样,你的代码的其余部分就可以在所有Windows版本上无条件地调用QueryOptionalDelayLoadedAPI()
,而你的自定义函数将在旧版本上被调用。或者,你可以对其他缺失的DLL函数做同样的事情。只要编写自己的替代函数来模仿官方函数,和/或返回代码可以查找的错误代码,如
ERROR_NOT_IMPLEMENTED
等。