我一直在使用动态库和 GetProcAddress 的东西很长一段时间,但它总是看起来乏味、智能敌对和丑陋的做事方式。
有谁知道在与旧操作系统兼容的同时导入新功能的干净方法。
假设我想使用一个 XML 库,它是 Vista 的一部分。我调用 LoadLibraryW,然后如果 HANDLE 不为空,我可以使用这些函数。
但我真的不想走#typedef (void*)(PFNFOOOBAR)(int, int, int)
and PFNFOOOBAR foo = reinterpret_cast<PFNFOOOBAR>(GetProcAddress(GetModuleHandle(), "somecoolfunction"));
,一直到 50 次。
是否有一个非黑客解决方案可以避免这种混乱?
我正在考虑在项目设置中添加coolxml.lib,然后在delayload dll 列表中包含coolxml.dll,并且,也许,复制我将在所需文件中使用的几个函数签名。然后检查 LoadLibraryW 返回的非空值,如果它是非空值,则像在常规程序流中一样分支到 Vista 分支。
但我不确定 LoadLibrary 和 delay-load 是否可以一起工作,以及某些分支预测是否在某些情况下不会搞砸。
另外,不确定这种方法是否可行,以及升级到下一个 SDK 后是否会导致问题。