티스토리 뷰
Programming Tips/MFC Advanced
DLL 만들기 3 - 명시적 호출(Explicit run-time linking)
Unikys 2007. 12. 5. 17:56이번엔 명시적 호출을 해보자...
역시 위키피디아 페이지에 있는 내용 중...
C and C++
#include <windows.h> #include <stdio.h> // DLL function signature typedef double (*importFunction)(double, double); int main(int argc, char **argv) { importFunction addNumbers; double result; // Load DLL file HINSTANCE hinstLib = LoadLibrary("Example.dll"); if (hinstLib == NULL) { printf("ERROR: unable to load DLL\n"); return 1; } // Get function pointer addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers"); if (addNumbers == NULL) { printf("ERROR: unable to find DLL function\n"); FreeLibrary(hinstLib); return 1; } // Call function. result = addNumbers(1, 2); // Unload DLL file FreeLibrary(hinstLib); // Display result printf("The result was: %f\n", result); return 0; }
다소 복잡하다...하지만 이거는 따로 프로젝트의 설정이 필요없기 때문에
나중에 내가 만든 DLL을 다른 사람들이 활용할 경우 예제소스만 주면 쉽게 할 수 있을 것이다..
프로젝트 설정을 못하는 사람들이 꼭 있더라고-_-+
그럼 바로 방금 만든 Preprocessor.dll이랑 Smoothing함수로 해보자..
{
,,,
//TODO : 테스트용 삭제
HINSTANCE hinstLib = LoadLibrary(L"Preprocessor.dll");
if (hinstLib == NULL) {
//에러 처리
return 1;
}
// Get function pointer
FARPROC procSmoothing = GetProcAddress(hinstLib, "Smoothing");
if (procSmoothing == NULL) {
//에러 처리
FreeLibrary(hinstLib);
return 1;
}
FARPROC procSmoothing = GetProcAddress(hinstLib, "Smoothing");
if (procSmoothing == NULL) {
//에러 처리
FreeLibrary(hinstLib);
return 1;
}
// Call function.
int testSize = 0;
int res = -1;
float* test;
res = ((int (*)(float* , int , float*& , int& , int))procSmoothing)(NULL , 3 , test , testSize , 0);
int testSize = 0;
int res = -1;
float* test;
res = ((int (*)(float* , int , float*& , int& , int))procSmoothing)(NULL , 3 , test , testSize , 0);
// Unload DLL file
FreeLibrary(hinstLib);
...
FreeLibrary(hinstLib);
...
}
그냥 짜는 중에 GetProcAddress의 리턴형을 보니 FARPROC이라고 되어있다..
기본형은 int(*)(void)이라고 되어있고 res 앞에서 이 FARPROC를 원하는 함수 포인터로 변환하는 것이 포인트이다.
또 중요한 것은 dll을 LoadLibrary 했으면 반드시 FreeLibrary해줘야한다는 것..
그럼 방금 묵시적 실행 때문에 했던 설정들을 지우고 breakpoint 걸어놓고 실행!
이렇던 값들이...
이렇게 바뀌었다! 뭐, 묵시적이나 명시적인거나 크게 어렵지는 않네...
단지 묵시적인 것은 툴에 익숙치 못한 사람들에게 불편하고 lib파일까지 복사하고 따로 함수 선언을 해줘야한다는 것.. 나중에 해당하는 소스를 지울 경우 여기저기 막 지워야하지만 명시적으로 호출할 경우에는 그 부분에 거진 다 있으므로 걱정할 필요는 없을 듯 하다...
이제는 시작할 때 로드 시키고, 미리 클래스에서 멤버 처럼 사용할 수 있도록 하는 것을 해보면 좋을 것 같다..
일단 구현하는건 해봤으니... 개발하다가 나중에
__declspec인가 뭔가-_-의 뜻들도 알아놔야겠다...
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Python
- gae
- 사진
- 강좌
- c++
- 속깊은 자바스크립트 강좌
- 삼식이
- 자바스크립트
- 팁
- 안드로이드 앱 개발 기초
- 탐론 17-50
- Android
- ny-school
- HTML5 튜토리얼
- GX-10
- 뽐뿌
- java
- 샷
- google app engine
- 서울
- 안드로이드
- gre
- TIP
- Javascript
- K100D
- Writing
- php
- mini project
- HTML5
- lecture
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함