我正在寻找一个在Windows机器上以毫秒为单位获取时间的函数.本质上,我想调用这个WinAPI函数GetTickCount(),但我坚持"使用LoadLibrary(...)n调用GetTickCount()函数"部分..
我搜索了每个论坛,谷歌搜索它,但到处都有人使用不完整的代码,不能编译..任何人都可以编写一个简短的示例程序来加载kernel32.dll并调用GetTickCount()来显示时间(以毫秒为单位)?
请编写编译的代码!
您应该做的第一件事是声明一个与导出函数兼容的函数指针类型.做到这一点至关重要,也是遇到麻烦的最大可能性.仔细查看函数声明来得出这个:
typedef DWORD (WINAPI * GetTickCount_t)(void);
Run Code Online (Sandbox Code Playgroud)
接下来,使用LoadLibrary和GetProcessAddress来获取函数指针值.您始终必须将GPA的返回值强制转换为函数指针类型.像这样:
HMODULE hKernel = LoadLibrary(L"kernel32.dll");
assert(hKernel);
GetTickCount_t pfnGetTickCount = (GetTickCount_t)GetProcAddress(hKernel, "GetTickCount");
assert(pfnGetTickCount);
Run Code Online (Sandbox Code Playgroud)
这里的失败模式是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();
Run Code Online (Sandbox Code Playgroud)
如果您的函数指针类型声明错误,那么您可能会使AV程序崩溃,获得奇怪的函数结果或不平衡的堆栈.