c - 为什么 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;
}
解决方案
文档中没有任何内容FreeLibrary()
表明(甚至建议)调用线程的错误代码将在成功调用时设置。因此,您对遵循GetLastError()
非零(成功)返回的调用FreeLibrary()
似乎会返回一个“任意”值。
从GetLastError()
文档中:
设置最后一个错误代码的每个函数的文档的返回值部分记录了函数设置最后一个错误代码的条件。大多数设置线程最后错误代码的函数在失败时都会设置它。但是,某些函数在成功时也会设置最后一个错误代码。如果该函数没有记录设置最后一个错误代码,则该函数返回的值只是最近设置的最后一个错误代码;一些函数在成功时将最后一个错误代码设置为 0,而其他函数则没有。
您可以通过在调用之前显式设置线程的错误代码来验证这一点:FreeLibrary()
//...
SetLastError(0); // Set last error code
int rez = FreeLibrary(hinstLib);
//...
编辑:如果即使有了这个,您仍然看到最后一个错误的“一致”值,那么很可能您本身mydll.dll
正在调用一个失败的 WinAPI 函数(原因/错误为),来自执行的代码在其程序部分。但是,如果该过程仍然返回,那么该函数也将返回(即它会发出您的 DLL已卸载的信号)。INVALID_HANDLE_VALUE
DLL_PROCESS_DETACH
DllMain()
TRUE
FreeLibrary()
TRUE
推荐阅读
- hadoop - 有没有办法为 Hive 中的表提供“第二个名称”,以便用户可以引用表的任一名称并检索相同的内容?
- kubernetes - 入口将域 www 重写为非 www url
- r - 层次聚类中质心链接背后的直觉是什么?
- java - 我应该如何命名一个只有 getter 的 Java 类?
- go - 如何在 Hana DB 上连接 SSL - SAP [SQL 错误 4321 - 只允许安全连接]
- c# - 如何使用 C# 代码使用命令 azure cli 导出数据库
- ios - 如何在 SwiftUI 的导航栏中添加“副标题”之类的内容?
- flutter - 尝试调用我的 getter 时,我得到了 Invalid argument(s)
- java - 如何将 jar 导入 Knime 中的 java 片段节点
- javafx - 创建时的样式 TreeItem