web-dev-qa-db-ja.com

C ++のメモリからDLLをアンロードする方法は?

DLLメモリからアンロードする方法。FreeLibraryを使用しましたが、まだロードされています

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

UnmapViewOfFileFreeLibraryAndExitThreadを使用しましたが、まだメモリ内にあります

5
user7435875

この例では、2つの関数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_

2番目のステップ:

fFreeResult = FreeLibrary(hinstLib);ステートメントを実行すると、次の結果が得られます。

enter image description here

ご覧のとおり、DLLは、プロセスuseDLL.exeのアドレス空間にロードされなくなりました。

2つの関数LoadLibraryFreeLibraryはうまく機能します。

このチュートリアルでは、_process Explorer_ を使用して、特定のプロセスでロードされたDLL)を表示する方法を確認できます。

14
HDJEMAI