VisualStudio.C++.C#2017. 3. 13. 20:49


 

개요.

 

Visual C++ 에서 DLL 을 이용하기 위한 2가지 방식 implicit linking, explicit linking 중 본 글은 explicit linking방식 정리.

코드작성 수월성에서는 implicit linking (상세보기 -> https://igotit.tistory.com/471 ) 이 훨씬 편리한 방식이나, explicit linking 을  사용해야 하는 경우도 있다.

dll 위치.
1. implicit linking 대상 dll 은 실행파일경로와 동일한 곳에 있어야 하나, explicit linking 대상 DLL은 임의 폴더에 두고 LoadLibrary 함수 호출시 경로를 지정해주면 된다.

2. explicit linking 대상 DLL(예. main.dll) 내에서 implicit linking 으로 다른 DLL(예 sub.dll) 이 로딩되는 구조라면 sub.dll 은 실행파일과 동일 경로에 있어야 main.dll 을 동적로딩시 main.dll 에서 sub.dll 을 정상로딩가능하다.

 
 


 


 

DLL 로딩과 해제

 

1. LoadLibrary . DLL 로딩함수.


 

HINSTANCE hInstDLL = LoadLibrary("mydll.dll");

if(hInstDLL == NULL) // 로딩실패임.
{
AfxMessageBox(_T("dll 로딩 실패"));
}



2. FreeLibrary. 로딩된 DLL 해제함수.

- MFC 코드인 경우 주로 OnDestroy 등 혹은 해제처리할 임의의 장소에 배치해두면 됨.


 FreeLibrary(hInstDLL);  



 
 


 

 

 동적 로딩한 DLL의 함수 사용

 
 

함수 GetProcAddress 로 DLL의 함수포인터 받고 호출하기.


예 : DLL 제공 함수  int funcDll(double in1, float in2); 가 있다고 하자. 

 typedef int (CALLBACK* pFuncType) (double, float); // DLL 제공하는 함수 자료형과 동일한 형태로 함수포인터 변수생성용 사용자 타입 정의.

 

 pFuncType pFuncDll = NULL; // 함수포인터 변수 pFuncDll 선언.


 pFuncDll = (pFuncType) GetProcAddress (hInstDLL,"funcDll"); // 인자 HINSTANCE, 호출할 DLL제공 함수명.

 

 pFuncDll(10.1, 9.8) ;// DLL 함수 funcDll 호출한거임.


상기 코드에서 GetPrcAddress 로 함수 포인터 받기 위한 사전 pFuncDll 처리부가 요점임.


MS사 상세정보.

-> https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(LIBLOADERAPI%2FGetProcAddress);k(GetProcAddress);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true


상기주소에서 제공하는 코드 예제.


 typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT); 
... 
 
HINSTANCE hDLL;               // Handle to DLL 
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer 
DWORD dwParam1; 
UINT  uParam2, uReturnVal; 
 
hDLL = LoadLibrary("MyDLL"); 
if (hDLL != NULL) 

   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, 
                                           "DLLFunc1"); 
   if (!lpfnDllFunc1) 
   { 
      // handle the error 
      FreeLibrary(hDLL); 
      return SOME_ERROR_CODE; 
   } 
   else 
   { 
      // call the function 
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2); 
   } 





 


 



///1248.

Posted by 리치굿맨

댓글을 달아 주세요