我已经使用动态库和GetProcAddress等方法有一段时间了,但这种方式总是让人感到繁琐、智能感知不友好且难看。
有没有人知道一种干净的方法来导入新功能并保持与旧操作系统兼容呢?
比如说,我想使用 Vista 中的 XML 库。我调用 LoadLibraryW,然后如果 HANDLE 非空,就可以使用函数了。
但我真的不想走 typedef (void*)(PFNFOOOBAR)(int, int, int) 和 PFNFOOOBAR foo = reinterpret_cast(GetProcAddress(GetModuleHandle(), "somecoolfunction")) 这样的方式,因为这太麻烦了,需要写 50 次。
有没有一种非 hack 的解决方案,可以避免这种混乱呢?
我考虑在项目设置中添加 coolxml.lib,然后在延迟加载 DLL 列表中包含 coolxml.dll,并在所需文件中复制我将使用的少量函数签名。然后检查 LoadLibraryW 返回值是否非空,如果非空,则像常规程序流程一样分支到 Vista 分支。
但我不确定 LoadLibrary 和延迟加载是否可以一起工作,也不确定某些分支预测不会在某些情况下搞乱事情。
此外,我也不确定这种方法是否可行,如果升级到下一个 SDK 后会不会出现问题。