【问题标题】:Version Helper functions for Windows XPWindows XP 的版本助手函数
【发布时间】:2015-01-05 22:27:57
【问题描述】:

在我的应用程序中,我需要检查 Windows 版本。我在Visual Studio 2013 (v120) platform toolset 中使用Version Helper functions。但随后该程序无法在 Windows XP 中运行。错误是:

'xxx.exe' is not a valid win32 application

所以我将平台工具集更改为Visual Studio 2013 - Windows XP (v120_xp)。但在这种情况下,应用程序将无法编译。 错误是:

error C1083: Cannot open include file: 'VersionHelpers.h': No such file or directory

我能做什么?我可以使用旧的GetVersionEx 功能吗? MSDN 说:

GetVersionEx may be altered or unavailable for releases after Windows 8.1. Instead, use the Version Helper APIs

但也许我现在应该使用它!

【问题讨论】:

    标签: c++ visual-c++ visual-studio-2013 windows-xp


    【解决方案1】:

    我已经设法使用 Remmy Lebeau 的评论解决了这个问题。

    我将C:\Program Files (x86)\Windows Kits\8.1\Include\um中的VersionHelpers.hwinapifamily.h中的sdkddkver.hC:\Program Files (x86)\Windows Kits\8.1\Include\shared复制到我的项目中,并更改了其中的一些包含。

    现在它可以使用 Windows XP 工具集进行编译。

    我已经对其进行了测试,它在所有版本的 Windows 中都能正常工作。

    【讨论】:

    • 您能否详细说明您在“包含”中所做的更改
    • @physicist 我不记得我做了什么。但它是直截了当的。
    【解决方案2】:

    这个怎么样:尝试用 GetProcAddress 手动链接函数,看看有什么可用的,如果新的 API 不是,那么旧的必须是,所以你可以使用你设法链接的那个而不会出错。

    我假设您正在构建 32 位或 64 位,并且两种情况下的操作系统都兼容。

    编辑:

    GetVersionEx(), here 是从 XP 中的 kerner32.dll 导出的,所以你可以尝试使用链接它

    GetProcAddress() here 也有 Microsft 使用“GetNativeSystemInfo”的建议。

    新的 API 函数

    IsWindowsXPOrGreater()   // also exported from kernel32.dll and ntdll.dll
    

    也可以使用 GetProcAddress() 以相同的方式链接。如果找不到您尝试链接的函数,此函数将返回错误,因此您将知道您有哪个可用。然后您调用可用的并获取您需要的版本信息。

    您只需要自己定义函数原型而不是使用标题,然后定义两个函数指针,每个指针一个,然后最初为它们分配一个 NULL 值,直到您尝试链接函数。然后一个指针(或两个指针)都会以一个值结束,您可以使用可用的最新指针来调用链接的 API。

    【讨论】:

    • 所以 Version Helper API 不能在 Windows XP 中使用,对吧?那为什么它有IsWindowsXPOrGreater的功能呢?你也可以详细说明你的答案吗?我不知道该怎么办。
    • IsWindowsXPOrGreater() 和其他 Version Helper 函数不会从任何 DLL 导出,因此您不能使用 GetProcAddress() 动态访问它们。它们是包装 VerifyVersionInfo()VerSetConditionMask() 的内联函数。并且这些功能自 Windows 2000 起就已经可用,因此也无需使用GetProcAddress() 来访问它们(除非您需要支持 Win9x/ME/NT4)。最简单的解决方案是复制VersionHelpers.h,以便 XP 工具集可以找到它。
    • @Mahmoodvcs 在这里您会找到一个示例代码,说明您必须做什么:msdn.microsoft.com/en-us/library/windows/desktop/… 通过函数指针包含调用。
    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 2010-11-15
    • 2015-05-14
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多