3. Implementation/Windows API
정규 DLL Implicit, Explicit 링킹에 대한 몇가지 잡담
SSKK
2008. 8. 10. 18:44
아래 함수를 일단 링크하는 법에 대해서 알아보자. ============================================================================== 1. DEF 파일을 사용하여 EXPORT ============================================================================== // 헤더 파일 #ifdef __cplusplus extern "C" { // 반드시 C 형태로 선언해야 한다. #endif void WINAPI func(); // WINAPI는 FAR PASCAL의 매크로로 CALLBACK과 같다. #ifdef __cplusplus } #endif // 소스 파일 void WINAPI func() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // DLL에서 MFC를 사용한다면.. TRACE("Hello dll\n"); } // DEF 파일 EXPORTS ; 명시적 내보내기를 여기에 사용할 수 있습니다. func @2 와 같이 한 후, Dll을 사용하는 프로그램에서, 프로젝트 종속성을 지정하여 위에서 만든 DLL의 라이브러리를 링크하든, 어쨋든 라이브러리 링크가 필요하다. 그리고, 위 DLL 생성시 선언한 헤더파일을 include 하든, 아래와 같이 선언하면 DLL에서 export 한 함수를 사용할 수 있다. extern "C" void WINAPI func(void); void CUseDllDlg::OnBnClickedButton1() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. func(); } ============================================================================== 2. __decl(dllexport) 사용하기 ============================================================================== // 헤더 파일 #define DLLEXPORT __declspec(dllexport) #ifdef __cplusplus extern "C" { #endif DLLEXPORT void WINAPI func(); #ifdef __cplusplus } #endif // 소스파일 ... 1과 동일 DEF 파일은 건들지 않고, extern "C" void WINAPI func(void); void CUseDllDlg::OnBnClickedButton1() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. func(); } 또는 extern "C" __declspec(dllimport) void WINAPI func(void); void CUseDllDlg::OnBnClickedButton1() { // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. func(); } 와 같이 사용할 수 있다. 만약 헤더 파일을 사용한다면, 아래와 같이 정의하면,,좀더 편하게 import, export 할 수 있다. #ifdef _EXPORTING #define CLASS_DECLSPEC __declspec(dllexport) #else #define CLASS_DECLSPEC __declspec(dllimport) #endif ============================================================================== 3. EXPLICIT LINKING ============================================================================== 위 두방법은 모두 implicit 링킹으로 DLL과 함께 생성된 LIB 파일이랑 함수 선언이 반드시 필요하다. 이제 이런 Lib와 헤더파일이 필요없는 Explicit 링킹을 해보자. LoadLiblary("test.dll") GetProAddress(...) 를 이용하여 함수 포인터를 얻어서 사용하면 된다. ============================================================================== 확장 DLL에 대해서 또 알아보자. ============================================================================== ==> 확장 DLL은 MFC 프로젝트에서만 이용할 수 있으며, (위 3가지 방법은 아무데서나 사용가능) 클래스를 사용할 수 있기 때문에, MFC만으로 개발하는 프로젝트에서는 확장 DLL을 사용하는 것이 좀더 편리할 것이다. ============================================================================== FAR에 관해서 ============================================================================== Any data pointers used in the API are explicit FAR pointers. Again, FAR, is not really necessary for Win32, but is useful if you plan to compile the code for 16-bit Windows sometime in the future ==> 첨부는 정규 DLL 예제(DLLScreenCap.zip)와 확장 DLL 예제(dllhusk.zip) |