为何GetLastError返回ERROR_INVALID_HANDLE?LoadLibrary/FreeLibrary成功仍报错
为什么成功调用LoadLibrary/FreeLibrary后GetLastError返回ERROR_INVALID_HANDLE?
这是Windows API编程里一个非常容易踩的坑——只有当API函数明确返回失败状态时,GetLastError()的返回值才是有效的。
你代码里的LoadLibraryA返回了有效的句柄,FreeLibrary也返回了非零值(表示成功),这时候调用GetLastError()得到的结果完全是随机的——它可能是程序启动后某个更早的系统调用留下的错误码,和你当前这两个函数的执行没有任何关系。
ERROR_INVALID_HANDLE(错误码6)就是这么来的:它不是LoadLibrary或FreeLibrary产生的,而是之前某个失败的API调用遗留下来的状态。
正确的用法示例
你应该只在函数失败时去获取错误码,修改后的代码应该是这样:
int main() { const char* mydll = "mydll.dll"; HINSTANCE hinstLib = LoadLibraryA(mydll); if (!hinstLib) { // LoadLibrary失败时才取错误码 printf("LoadLibrary failed! Error: %d\n", GetLastError()); } else { int rez = FreeLibrary(hinstLib); if (!rez) { // FreeLibrary失败时才取错误码 printf("FreeLibrary failed! Error: %d\n", GetLastError()); } else { printf("SUCCESS!\n"); } } return 0; }
补充说明
Windows的错误码机制是:每个线程都维护一个错误码存储区,API函数只有在失败时才会更新这个值;如果函数成功,它不会主动去清除这个值,所以里面保留的还是之前的错误信息。这也是为什么成功调用后GetLastError()会返回看似无关的错误码。
内容的提问来源于stack exchange,提问作者IGP
相关产品推荐
相关产品推荐

