gpt4 book ai didi

c - 有效地为不同的 Windows 版本使用不同的 API

转载 作者:可可西里 更新时间:2023-11-01 09:39:53 26 4
gpt4 key购买 nike

我面临着使用可用的新 Windows 运行时功能的需要,并回退到新功能不存在的旧功能。

代码路径对性能至关重要。如果平台 (Windows 8/Windows Server 2012) 提供,我需要调用 GetSystemTimePreciseAsFileTime,如果不存在较新的版本,则回退到 GetSystemTimeAsFileTime

我知道我可以使用 LoadLibraryGetProcAddress 加载 GetSystemTimePreciseAsFileTime 如果失败,回退到 GetSystemTimeAsFileTime 。我担心通过另一层间接调用像这样对性能至关重要的东西对性能的影响。

是否有任何内置机制来延迟加载符号,而不是整个 DLL?因此,我可以在启动时测试 Windows 版本,并在 Win8 上调用使用 GetSystemTimePreciseAsFileTime 的函数,否则调用使用 GetSystemTimeAsFileTime 的函数,而不会导致整个可执行文件失败并显示旧版 Windows 上的链接错误?

或者我应该停止担心并使用 GetProcAddress

最佳答案

正如对问题的各种评论所说,GetProcAddress() 的成本是最小的。通过函数指针调用函数的成本也接近于零。

但是假设我们正在超批判地工作。我们观察到您要调用的两个函数具有签名

VOID WINAPI GetSystemTimePreciseAsFileTime(LPFILETIME lpSystemTimeAsFileTime);
void WINAPI GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime);

也就是说,它们具有几乎相同的签名;唯一的区别是 VOID 的奇怪返回类型... which MSDN says is just a macro that expands to void , 所以它们完全相同。

这是什么意思?这意味着您可以使用单个函数指针变量,在程序开始时初始化一次,如下所示:

// global scope
VOID (*WINAPI myGetSystemTime)(LPFILETIME);

// in your initalization code
FARPROC fp;
myGetSystemTime = GetSystemTimeAsFileTime;
if (/* LoadLibraryW(L"kernel32.dll") worked */) {
fp = GetProcAddress(/* library handle */, "GetSystemTimePreciseAsFileTime");
if (fp != NULL)
myGetSystemTime = (VOID (*WINAPI)(LPFILETIME)) fp;
}
// and don't worry about errors from LoadLibraryW() or GetProcAddress() since we want to use the fallback; you may log a warning if you so choose

然后您需要做的就是在需要有选择地调用函数时调用(*myGetSystemTime)(&time)。没有条件分支或不断轮询 DLL,并且应该没有可衡量的性能影响。

关于c - 有效地为不同的 Windows 版本使用不同的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com