windows - 如果操作系统支持,如何有条件地执行函数?

标签 windows backwards-compatibility

我想构建一个调用 CancelIoEx 的应用程序在 Windows Vista 和更新版本(支持的地方)上,并在 Windows XP(不支持的地方)上执行其他操作。

  1. 如果我在 Windows 7 下编译应用程序但在 Windows XP 下运行它会发生什么情况?运行时会发生什么?我会遇到某种加载错误吗?

  2. 如何让我的应用程序根据运行时使用的操作系统选择一个或另一个代码路径(避免加载错误)?请提供示例代码。

更新:请注意,Windows XP 上存在 DLL,但该函数不存在。

最佳答案

是的,引用不存在的 DLL 导出的应用程序将无法加载。

添加代码以根据操作系统版本采用不同的路径不会有太大帮助,因为您仍然可以引用不存在的函数。

相反,您需要在运行时解析引用。

一个选项是延迟加载导入(使用 /DELAYLOAD 链接器标志),但我认为核心系统 DLL(如 kernel32)不支持此功能。

另一种是使用LoadLibraryGetProcAddress。代码是这样的,但实际上您会在应用程序启动时查找一次,而不是每次调用该函数时查找。

// Declare type of pointer to CancelIoEx function
typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);

// Load module; won't fail because it's already imported
HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");
// Look up function address
CancelIoExType pCancelIoEx = (CancelIoExType)GetProcAddress(hKernel32, "CancelIoEx");
// Do something with it
if (pCancelIoEx)
{
    // Function exists so call it
    pCancelIoEx(hMyFile, pMyOverlapped);
}
else
{
    // Function doesn't exist
}

关于windows - 如果操作系统支持,如何有条件地执行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9023268/

相关文章:

windows - 在 Windows 7 x86 上安装 Thin 时出现问题

Windows 版本预处理器和为向后兼容而构建?

android - 如何处理 Android 中已弃用的类以保持兼容性

windows - git - 两个分支名称相同?区别是一个小写 - 一个混合大小写?

windows - Go - 我如何检测用户 PC 是否正在运行一些必备工具,例如 Google Chrome

windows - 在不询问管理员密码的情况下执行 wamp (windows)

java - Guava 二进制文件是否与以前的版本兼容?

macos - 如何向 Lion Cocoa 应用程序添加 Leopard 和 Snow Leopard 支持?

iphone - UIWindow rootViewController 的向后兼容性

architecture - ARM v7 平台上的 ARM v5 共享库 (ftd2xx) - 硬 float 与软 float 问题