我无法理解以下代码中的getlasterror
函数会发生什么。
我的dll
是有效的,并且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;
}
答案 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 已被卸载)。>