首页 > 解决方案 > 为什么 GetLastError 返回 ERROR_INVALID_HANDLE?

问题描述

我无法理解getlasterror以下代码中的函数会发生什么。
Mydll是有效的LoadLibrary并且FreeLibrary不会失败,但会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;
}

标签: cwindowsdll

解决方案


文档中没有任何内容FreeLibrary()表明(甚至建议)调用线程的错误代码将在成功调用时设置。因此,您对遵循GetLastError()非零(成功)返回的调用FreeLibrary()似乎会返回一个“任意”值。

GetLastError() 文档中:

设置最后一个错误代码的每个函数的文档的返回值部分记录了函数设置最后一个错误代码的条件。大多数设置线程最后错误代码的函数在失败时都会设置它。但是,某些函数在成功时也会设置最后一个错误代码。如果该函数没有记录设置最后一个错误代码,则该函数返回的值只是最近设置的最后一个错误代码;一些函数在成功时将最后一个错误代码设置为 0,而其他函数则没有。

您可以通过在调用之前显式设置线程的错误代码来验证这一点:FreeLibrary()

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

编辑:如果即使有了这个,您仍然看到最后一个错误的“一致”值,那么很可能您本身mydll.dll正在调用一个失败的 WinAPI 函数(原因/错误为),来自执行的代码在其程序部分。但是,如果该过程仍然返回,那么该函数也将返回(即它会发出您的 DLL卸载的信号)。INVALID_HANDLE_VALUEDLL_PROCESS_DETACHDllMain()TRUEFreeLibrary()TRUE


推荐阅读