如何判断Windows模块句柄是否仍然有效?

Two*_*ter 5 windows winapi module handle

可以卸载模块,那么如何确定它是否仍在内存中?我有一个句柄,从GetModuleHandle获得.当我尝试在其上调用GetHandleInformation时,我看到错误0xc0000008 - "指定了无效的HANDLE".这发生在它可以被卸载之前.

Mic*_*ael 4

“句柄”一词在这里有点泛滥——Win32 API 中许多不同类的对象都称为“句柄”。

GetHandleInformation 用于内核对象的句柄 - 文件、注册表项、互斥体等。

GetModuleHandle 返回的 HMODULE 由加载程序使用,并不是实际的内核对象,因此 GetHandleInformation 失败。不过,您在 GetHandleInformation 中获得的两个标志对于 HMODULE 都没有意义。

如果你想检查 HMODULE 是否仍然加载在内存中,你可以调用 GetModuleHandle - 这个 API 应该足够快,可以多次调用。但是,GetModuleHandle 的结果在返回时可能无效 - 另一个线程可能调用了 FreeLibrary。最好确保 DLL 确实保持加载状态。您可以通过自己调用 LoadLibrary 或调用 GetModuleHandleEx 来完成此操作,这将增加 DLL 的引用计数。