为什么GetLastError返回ERROR_INVALID_HANDLE?

时间:2020-06-29 09:31:16

标签: c windows dll

我无法理解以下代码中的getlasterror函数会发生什么。
我的dll是有效的,并且LoadLibraryFreeLibrary不会失败,但是GetLastError返回:

6(ERROR_INVALID_HANDLE)。

代码:

int main()
{
    const char* mydll = "mydll.dll";
    HINSTANCE hinstLib;


    hinstLib = LoadLibraryA(mydll);

    if (hinstLib) {

        int rez = FreeLibrary(hinstLib);
        
        if (rez) {
            printf(" SUCCESS but Geterror:: %d\n", GetLastError());
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:2)

FreeLibrary()的文档中没有任何内容指示(甚至暗示)将在成功调用上设置调用线程的错误代码。因此,在您从GetLastError()返回非零(成功)之后,对FreeLibrary()的调用将似乎返回“任意”值。

来自GetLastError() documentation

有关每个函数的文档的“返回值”部分 设置最后一个错误代码,记下该函数的条件 设置最后一个错误代码。设置线程的大多数功能 上一次错误代码会在失败时进行设置。但是,某些功能也 成功时设置最后一个错误代码。如果功能不是 记录设置最后错误代码,由此返回的值 函数只是已设置的最新最近错误代码; 一些函数在成功时将最后一个错误代码设置为0,而其他函数则将 不是。

您可以可能通过明确地设置此线程的错误代码 在调用FreeLibrary()之前进行验证:

    //...
    SetLastError(0); // Set last error code
    int rez = FreeLibrary(hinstLib);
    //...

编辑:如果即使有此设置,您仍然看到最后一个错误的“一致”值,那么您的mydll.dll很可能是 从其INVALID_HANDLE_VALUE过程的DLL_PROCESS_DETACH部分执行的代码中调用失败的WinAPI函数(原因/错误为DllMain())。但是,如果该过程仍然返回TRUE,则FreeLibrary()函数也将返回TRUE(即它将表明您的DLL 已被卸载)。

相关问题