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我完全同意!我正在添加我的最新编辑,而您正在发布最后一条评论。