You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:27:54