gpt4 book ai didi

c - FreeLibrary API 调用失败怎么办?

转载 作者:可可西里 更新时间:2023-11-01 12:41:32 24 4
gpt4 key购买 nike

问题

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

是否有强制卸载库的选项?

当 FreeLibrary 调用时你会做什么?

其他背景

当使用加载时动态链接时,这已经够烦人了,但最终应用程序会被操作系统拆除。使用运行时动态链接时会出现问题。我加载这个 DLL,使用它,然后在某些情况下我需要从我的进程的虚拟地址空间卸载它,然后继续运行。当我在第三方库上调用 FreeLibrary 时,它会做一些清理工作(即在 DllMain when DLL_PROCESS_DETACH 中被调用)。当它进行清理时,它会导致抛出它不处理的异常,并作为 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( ) );
}
}

关于c - FreeLibrary API 调用失败怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6153401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com