我想构建一个调用 CancelIoEx 的应用程序在 Windows Vista 和更新版本(支持的地方)上,并在 Windows XP(不支持的地方)上执行其他操作。
如果我在 Windows 7 下编译应用程序但在 Windows XP 下运行它会发生什么情况?运行时会发生什么?我会遇到某种加载错误吗?
如何让我的应用程序根据运行时使用的操作系统选择一个或另一个代码路径(避免加载错误)?请提供示例代码。
更新:请注意,Windows XP 上存在 DLL,但该函数不存在。
最佳答案
是的,引用不存在的 DLL 导出的应用程序将无法加载。
添加代码以根据操作系统版本采用不同的路径不会有太大帮助,因为您仍然可以引用不存在的函数。
相反,您需要在运行时解析引用。
一个选项是延迟加载导入(使用 /DELAYLOAD
链接器标志),但我认为核心系统 DLL(如 kernel32)不支持此功能。
另一种是使用LoadLibrary
和GetProcAddress
。代码是这样的,但实际上您会在应用程序启动时查找一次,而不是每次调用该函数时查找。
// 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/