티스토리 뷰


이번엔 명시적 호출을 해보자...

역시 위키피디아 페이지에 있는 내용 중...


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;
    }
    // Call function.
 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);
...
}


그냥 짜는 중에 GetProcAddress의 리턴형을 보니 FARPROC이라고 되어있다..

기본형은 int(*)(void)이라고 되어있고 res 앞에서 이 FARPROC를 원하는 함수 포인터로 변환하는 것이 포인트이다.

또 중요한 것은 dll을 LoadLibrary 했으면 반드시 FreeLibrary해줘야한다는 것..

그럼 방금 묵시적 실행 때문에 했던 설정들을 지우고 breakpoint 걸어놓고 실행!


사용자 삽입 이미지
이렇던 값들이...

사용자 삽입 이미지

이렇게 바뀌었다! 뭐, 묵시적이나 명시적인거나 크게 어렵지는 않네...

단지 묵시적인 것은 툴에 익숙치 못한 사람들에게 불편하고 lib파일까지 복사하고 따로 함수 선언을 해줘야한다는 것.. 나중에 해당하는 소스를 지울 경우 여기저기 막 지워야하지만 명시적으로 호출할 경우에는 그 부분에 거진 다 있으므로 걱정할 필요는 없을 듯 하다...

이제는 시작할 때 로드 시키고, 미리 클래스에서 멤버 처럼 사용할 수 있도록 하는 것을 해보면 좋을 것 같다..

일단 구현하는건 해봤으니... 개발하다가 나중에

__declspec인가 뭔가-_-의 뜻들도 알아놔야겠다...
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함