gpt4 book ai didi

winapi - 如何在 C++ 中使用 LoadLibrary(..) 调用 kernel32.dll 函数 GetTickCount()

转载 作者:行者123 更新时间:2023-12-02 15:40:53 25 4
gpt4 key购买 nike

我正在寻找一个函数来在 Windows 机器上获取以毫秒为单位的时间。本质上,我想调用此 WinAPI 函数 GetTickCount(),但我停留在“使用 LoadLibrary(...) n 调用 GetTickCount() 函数”部分..

我搜索了每个论坛并在谷歌上进行了搜索,但到处都有人使用无法编译的不完整代码。任何人都可以编写一个简短的示例程序来加载 kernel32.dll 并调用 GetTickCount() 以显示以毫秒为单位的时间吗?

请编写可编译的代码!

最佳答案

您应该做的第一件事是声明一个与导出函数兼容的函数指针类型。做到这一点是至关重要的,也是遇到麻烦的最大可能性。仔细查看函数声明以得出以下结论:

 typedef DWORD (WINAPI * GetTickCount_t)(void);

接下来,使用LoadLibrary 和GetProcessAddress 获取函数指针值。您始终必须将 GPA 的返回值转换为函数指针类型。像这样:

HMODULE hKernel = LoadLibrary(L"kernel32.dll");
assert(hKernel);
GetTickCount_t pfnGetTickCount = (GetTickCount_t)GetProcAddress(hKernel, "GetTickCount");
assert(pfnGetTickCount);

此处的故障模式是 DLL 的路径。我不必指定一个,因为 kernel32.dll 存储在 c:\windows\system32 中,该目录始终位于搜索路径中。对于您自己的 DLL,情况通常不是这样。只有将它存储在与主 EXE 相同的目录中,您才能指定 DLL 文件名而不是完整路径。查看 SetDllDirectory() 的文档以获取背景信息。

以及导出函数的名称。同样,这里很容易,Windows API 函数以未修饰的名称导出。这通常不是您自己的 DLL 的情况,如果您没有使用 extern "C"声明函数并使用 C++ 编译器,则导出可以使用前导下划线、"@nn"后缀或损坏的名称导出。要查看真实名称,请在 DLL 上使用 Dumpbin.exe/exports。另请注意,GetProcAddress 使用 const char*,这与使用 Unicode 字符串的其余 Windows API 不同。字符串文字上没有 L 前缀。

然后调用它,很简单:

DWORD tick = pfnGetTickCount();

如果你的函数指针类型声明错误,那么你的程序可能会因 AV 而崩溃,得到奇怪的函数结果或不平衡的堆栈。

关于winapi - 如何在 C++ 中使用 LoadLibrary(..) 调用 kernel32.dll 函数 GetTickCount(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6557028/

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