如何在C ++中从内存中卸载DLL?

时间:2017-03-12 14:20:44

标签: c++ memory dll loadlibrary

如何从内存中卸载DLL。我使用FreeLibrary但仍然加载了

HINSTANCE hGetProcIDDLL = LoadLibrary("path.dll");
f_funci func = (f_funci)GetProcAddress(hGetProcIDDLL, "method");
int x = func();
FreeLibrary(hGetProcIDDLL);

我使用了UnmapViewOfFileFreeLibraryAndExitThread,但它仍然在内存中

1 个答案:

答案 0 :(得分:10)

在这个例子中,我将展示一个简短的测试,我们可以看到两个函数LoadLibraryFreeLibrary的效果非常好。

我将使用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"));

结果如下:

enter image description here

我们可以清楚地看到test3.dll被加载到进程useDLL.exe

的地址空间中

第二步:

执行fFreeResult = FreeLibrary(hinstLib);语句时,结果如下:

enter image description here

正如我们所见,DLL在进程usedL.exe的地址空间中没有加载longuer

这两项功能LoadLibraryFreeLibrary效果很好。

您可以查看this tutorial to see how to use process explorer以显示给定进程中加载​​的DLL。