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

| 题 我有一个第三方DLL,当尝试从本机C应用程序中将其卸载时会引发未处理的异常。这导致对FreeLibrary的调用失败,并且模块仍在我的进程中加载​​。 是否有任何选项可以强制卸载库? FreeLibrary打电话时您会怎么做? 其他背景 当使用加载时动态链接时,这很烦人,但是最终应用程序被操作系统拆除。使用运行时动态链接时会出现问题。我加载了该DLL,使用了它,然后在某些情况下,我需要从进程的虚拟地址空间中将其卸载,然后继续运行。当我在第三方库上调用FreeLibrary时,它会做一些清理工作(即在DLL_PROCESS_DETACH被调用时在DllMain中)。在清理过程中,它会引发无法处理的异常,并作为FreeLibrary的未处理异常冒泡。这导致调用失败,并且模块仍保持加载状态。 我已经与供应商签了票,所以希望我能得到一个修复程序,该修复程序将允许该特定的库成功卸载。但是,如果我不这样做,并且对于这个问题的一般情况,我很好奇这些选项是什么。     
已邀请:
        如果仅在从内存中卸载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( ) );
   }
}
或者,如果它是您未显式加载的库(例如,由您加载的库加载的库依赖项)并且没有句柄,请使用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( ) );
   }
}
    
        我认为只有一种可能的解决方案-通过专用线程与dll互操作。因此,在需要卸载dll时,您只需退出(或可能被杀死)该线程,并且与该线程相关的所有资源都将被释放。在这种情况下,您不能保证内存泄漏,但我建议将此解决方案作为临时解决方案,直到3d party修复dll中的错误为止     
        这可能不是您遇到的问题,但万一是: 将链接器支持用于运行时动态链接时,请不要忘记使用/ Delay:Unload参数。     

要回复问题请先登录注册