FreeLibrary API调用失败时该怎么办?

Zac*_*ame 10 c windows dll winapi native

我有一个第三方DLL在尝试从我的本机C应用程序卸载它时抛出一个未处理的异常.这导致对FreeLibrary的调用失败,并且模块仍在我的进程中加载​​.

有没有强制卸载库的选项?

FreeLibrary调用时你会怎么做?

附加背景

当使用加载时动态链接时,这很烦人,但最终应用程序被操作系统拆除.使用运行时动态链接时会出现问题.我加载这个DLL,使用它,然后在某些情况下,我需要从我的进程的虚拟地址空间卸载它,然后继续运行.当我在第三方库上调用FreeLibrary时,它会执行一些清理工作(即在调用DLL_PROCESS_DETACH时DllMain中).虽然它正在进行清理,但它会导致抛出一个它无法处理的异常,并且作为FreeLibrary的未处理异常冒泡.这会导致调用失败并且模块仍然加载.

我已经向供应商提供了一张票,所以希望我能得到一个修复程序,这将允许这个特定的库成功卸载.但是,如果我不这样做,并且对于这个问题的一般情况,我很好奇这些选项是什么.

cry*_*ted 7

如果你只是从你可以使用的内存中卸载DLL

UnmapViewOfFile

提供加载的dll的基地址作为参数.

例:

HINSTANCE hInst = LoadLibrary( "path_to_dll" );

if( !FreeLibrary( hInst ) )
{
   fprintf( stderr, "Couldn't unload library. Error Code: %02X\n. Attempting to unmap...", GetLastError() );
   if( !UnmapViewOfFile( hInst ) )
   { 
     fprintf( stderr, "Couldn't unmap the file! Error Code: %02X\n", GetLastError( ) );
   }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果它是您未显式加载的库(例如,由您加载的库加载的库依赖项)并且您没有该句柄,则使用GetModuleHandle:

HINSTANCE hInst = GetModuleHandle( "dllname_you_didn't_load" );
if( hInst != NULL )
{
   if( !UnmapViewOfFile( hInst ) )
   { 
     fprintf( stderr, "Couldn't unmap the file! Error Code: %02X\n", GetLastError( ) );
   }
}
Run Code Online (Sandbox Code Playgroud)