- Linker - Windows 에서 Static Linking, Dynamic Linking 실습 1에서는 묵시적 방법으로 DLL을 호출해보았다. 

 

하지만, 묵시적 방법은 DynamicLib_Test.lib를 사용하며, 실행파일이 로드타임시에 로드되고, 종료시에 해제된다.  

따라서, dynamic 링킹의 의미를 잃지 않나 싶다 (필요할때 쓰고, 필요하지 않으면 쓰지 않는). 

그러므로, 이번에는 명시적 방법으로 DLL을 호출 해보자. 

 

WinDbg로 본 DynamicLib의 묵시적 호출. Execution Time이 아닌 Load Time시에 호출된다.  

Windows API가 제공하는 LoadLibrary(), GetProcAddress(), FreeLibrary()를 이용하여 명시적으로 호출하면, dll을 .lib와 관계 없이 사용가능하며, 로드시간이 아닌 실행시간중 필요할때 호출하고, 사용후 free할 수 있다.  

따라서 암시적 호출에서 사용했던 header파일 include나 .lib파일을 추가 시키지 않아도 된다.

다만, dll파일을 실행파일과 같은 디렉토리에 두는것은 변함이 없다. 

 

1. 프로젝트 속성 > C/C++ > 일반 > 추가 포함 디렉터리 > 에 "dynamic_source.h"의 디렉토리 경로 추가.  (X)

2. 프로젝트 속성 > 링커 > 일반 > 추가 라이브러리 디렉터리 > 에 "DynamicLib_Test.lib"의 디렉토리 경로 추가. (X)

3. 프로젝트 속성 > 링커 > 입력 > 추가 종속성 > DynamicLib_Test.lib 추가 (X)

4. MyApp.exe이 들어있는 폴더 안에 DynamicLib_Test.dll 가져다 놓기 (0) 

 

아래는 명시적 호출의 예시 코드 이다. 

 

#include <iostream>
#include <Windows.h>

typedef int (*MY_FUNCTION) (int);

int main() 
{
  HMODULE hDll = LoadLibrary(L"DynamicLib_Test.dll");

  if (hDll != NULL)
  {
     MY_FUNCTION my_function = (MY_FUNCTION)::GetProcAddress(hDll, "multiply_four");
     std::cout << "result : " << my_function(100) << std::endl;
     FreeLibrary(hDll);
  }
}

결과는 실습1과 마찬가지로 400이 잘 나온다.

 

WinDbg로 본 DynamicLib의 명시적 호출.  Load Time이 아닌 Execution Time에 호출됨.

 

+ Recent posts