WinCNT

Dynamic-Link Library(DLL) - 명시적 링킹(Explicit Linking) 본문

게임 프로그래밍(학습 내용 정리)/시스템 프로그래밍

Dynamic-Link Library(DLL) - 명시적 링킹(Explicit Linking)

WinCNT_SSS 2022. 6. 7. 12:45

DLL의 암시적 링킹과 명시적 링킹

DLL의 암시적 링킹(Implicit Linking)인 경우,

로드 타임에 DLL를 로드하기 때문에 프로그래머가 코드에 DLL를 넣지 않는다

(물론 DLL의 lib파일을 포함시켜야 한다)

 

하지만 DLL의 암시적 링킹의 경우는 DLL이 없을 경우는 실행 자체가 불가능해진다

 

반면 DLL의 명시적 링킹의 방법은 DLL의 로드가 런 타임 중에 일어나기 때문에

(적절한 예외 처리를 하면)프로그램의 실행에는 문제가 없다

명시적인 DLL 모듈 로딩

std::string path = "../x64/Debug/MyTestDLL.dll";
HMODULE hDll = ::LoadLibraryA(path.c_str());

LoadLibrary는 내부적으로 ANSI로 처리하기 때문에 보통 A를 붙여서 사용한다

명시적인 DLL 모듈 언로딩

::FreeLibrary(hDll);

명시적인 DLL 모듈 사용의 예제

typedef void (*DLL_FIBONACCI_INT)(const unsigned long long a, const unsigned long long b);
typedef bool (*DLL_FIBONACCI_NEXT)();
typedef unsigned long long (*DLL_FIBONACCI_CURRENT)();
typedef unsigned (*DLL_FIBONACCI_INDEX)();


int main()
{
    std::string path = "../x64/Debug/MyTestDLL.dll";
    HMODULE hDll = ::LoadLibraryA(path.c_str());
    if (hDll != NULL)
    {
        DLL_FIBONACCI_INT pInitFn = (DLL_FIBONACCI_INT)::GetProcAddress(hDll, "fibonacci_init");
        DLL_FIBONACCI_NEXT pNextFn = (DLL_FIBONACCI_NEXT)::GetProcAddress(hDll, "fibonacci_next");
       
        DLL_FIBONACCI_CURRENT pCurFn = (DLL_FIBONACCI_CURRENT)::GetProcAddress(hDll, "fibonacci_current");
        DLL_FIBONACCI_INDEX pIndexFn = (DLL_FIBONACCI_INDEX)::GetProcAddress(hDll, "fibonacci_index");

        pInitFn(1, 1);
        
        do {
            std::cout << pIndexFn() << ": "
                << pCurFn() << std::endl;
        } while (pNextFn());
       
        std::cout << pIndexFn() + 1 <<
            " Fibonacci sequence values fit in an " <<
            "unsigned 64-bit integer." << std::endl;

        system("pause");


        ::FreeLibrary(hDll);
    }
}

typedef로 함수 포인터를 미리 정의해두고, GetProcAddress로 DLL의 함수 포인터를 반환 받아서

나중에 함수처럼 사용하면 된다

 

궁금한 점은 typedef 함수 포인터를 대신할 모던 C++ 문법이 없을까하는 것

function<>을 사용하면 더 깔끔해질 거 같긴 하다...?

 

SSS