如何从内存中卸载DLL。我使用FreeLibrary但仍然加载了
HINSTANCE hGetProcIDDLL = LoadLibrary("path.dll");
f_funci func = (f_funci)GetProcAddress(hGetProcIDDLL, "method");
int x = func();
FreeLibrary(hGetProcIDDLL);
我使用了UnmapViewOfFile
和FreeLibraryAndExitThread
,但它仍然在内存中
答案 0 :(得分:10)
在这个例子中,我将展示一个简短的测试,我们可以看到两个函数LoadLibrary
和FreeLibrary
的效果非常好。
我将使用Process explorer
来显示当前进程地址空间中是否加载了DLL。
所以我创建了一个名为test3.dll的非常简单的dll
这是一个使用它的简单程序:
// A simple program that uses LoadLibrary and
// Access test3.dll.
// Then Unload test3.dll
#include <windows.h>
#include <iostream>
typedef int (__cdecl *MYPROC)(LPWSTR);
int main( void )
{
HINSTANCE hinstLib;
BOOL fFreeResult;
// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("test3.dll")); //1: load the DLL
// If the handle is valid, unload the DLL
if (hinstLib != NULL)
{
fFreeResult = FreeLibrary(hinstLib); //2: unload the DLL
}
return 0;
}
第一步:
执行此声明时:
hinstLib = LoadLibrary(TEXT("test3.dll"));
结果如下:
我们可以清楚地看到test3.dll被加载到进程useDLL.exe
第二步:
执行fFreeResult = FreeLibrary(hinstLib);
语句时,结果如下:
正如我们所见,DLL在进程usedL.exe的地址空间中没有加载longuer
这两项功能LoadLibrary
和FreeLibrary
效果很好。
您可以查看this tutorial to see how to use process explorer
以显示给定进程中加载的DLL。