C 为什么GetLastError返回错误\u无效\u句柄?

C 为什么GetLastError返回错误\u无效\u句柄?,c,windows,dll,C,Windows,Dll,我无法理解下面代码中的getlasterror函数发生了什么Mydll是有效的,并且LoadLibrary和FreeLibrary不会失败,但是GetLastError返回: 6(错误\无效\句柄) 守则: int main() { const char* mydll = "mydll.dll"; HINSTANCE hinstLib; hinstLib = LoadLibraryA(mydll); if (hinstLib) {

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

6(错误\无效\句柄)

守则:

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;
}

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

GetLastError()

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

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

/。。。
SetLastError(0);//设置最后一个错误代码
int rez=自由图书馆(hinstLib);
//...

编辑:如果即使这样,您仍然看到上一个错误的“一致”值,那么您的
mydll.dll
本身调用的WinAPI函数很可能失败(原因/错误为
无效\u句柄\u值
),从其
DllMain()
过程的
DLL\u进程中执行的代码中分离。但是,如果该过程仍然返回
TRUE
,则
FreeLibrary()
函数也将返回
TRUE
(即,它将发出DLL已卸载的信号)。

仅当函数失败时,检测调用
GetLastError()
(如果api设置了它)。如果
freebrary
返回true-当
freebrary
正常时,
GetLastError
未定义的结果-它不会设置上一个错误,也不会将其重置为0。因此,您可以在此处查看以前内部调用中的一些垃圾和旧值,如果您放入另一个
printf(“成功但Geterror::%d\n”,GetLastError()),会发生什么情况就在
int rez=FreeLibrary(hinstLib)之前?这将是输出:SUCCESS but Geterror::6 SUCCESS but Geterror::6在调用(一般情况下)api之前显式设置线程的错误代码可能足够复杂,并且会对另一个api执行许多内部调用。其中一些调用可能会失败并设置最后一个错误。但整个顶级api调用并没有失败。因此,
GetLastError
返回值可能未定义,即使在api调用之前将last error设置为0,在api调用之后仍然返回6FreeLibrary@RbMm看来OP的测试站在了你这一边!嗯…@AdrianMole-这只是个未知数。例如,如果
freebrary
最终卸载了dll(这可以是也可以不是,取决于dll引用计数),那么它将被
dll\u PROCESS\u DETACH
调用为入口点(同样,如果dll有入口点)。在这里,自定义dll代码可以进行一些api调用。其中一些可能会失败并更改最后的错误代码。但最后还是会卸载dll,并且
freebrary
返回true。所有可能的说法-无任何意义调用,如果
freebrary
返回true,则检查
GetLastError
。@RbMm我完全同意!我正在添加我的最新编辑,而您正在发布最后一条评论。