본문 바로가기

Contact English

【컴퓨터과학】 Dll Explicit Linking

 

Dll Explicit Linking (ref)

 

추천글 : 【C 언어】 C 언어 목차 


 

dll은 동적 링크 라이브러리의 약자로, 여러 함수가 저장돼 있어 exe 파일이 프로세스를 실행시키는 과정에서 계속 참고해 본다. dll을 호출하는 방법은 명시적 호출(explicit linking)과 암시적 호출(implicit linking)이 있고, 암시적 호출이 더 간단명료하므로 자주 쓰이는 편이다. 참고로 명시적 호출은 dll 파일만 있으면 가능한 반면에, 이와 대조적인 암시적 호출은 dll, lib, header 파일이 필요하다. 이 포스팅은 dll을 생성하고, 이를 명시적으로 호출하는 방법을 소개한다. (IDE는 CodeBlocks를 기준으로 설명한다; Visual C++도 굉장히 비슷하게 진행된다.)

 

1) File - New - Project - Dynamic Link Library를 실행시킨다. 그 뒤 dll의 이름을 결정한다.
2) h 파일의 내용을 다음과 같이 바꾼다.

 

#pragma once

#ifdef DLLEXPORT  // if DLLEXPORT is definded
#define DLLTYPE __declspec(dllexport)
#else  // if not
#define DLLTYPE __declspec(dllimport)
#endif

 

3) cpp 파일의 내용을 다음과 같이 바꾼다.

 

#define  DLLEXPORT  // define DLLEXPORT (like switching)
#include "my_Math.h"

extern "C"  DLLTYPE
int my_add (int a, int b)
{
    return a + b;
}

 

4) Build - Build를 통해 dll 파일을 생성시킨다. 생성된 dll 파일은 bin 폴더 안에 있다.
5) 새 프로젝트(C/C++ 상관 없음)를 생성하고 다음 코드를 실행시킨다.

 

#include <stdio.h>
#include <windows.h>

typedef int (*ALUFunc) (int, int);

int main()
{
    int a = 3, b = 5;
    int result;
    ALUFunc my_func;
    HINSTANCE hInstLib = LoadLibrary("C:/Users/sun2/Desktop/ㄱㄴㄷ/bin/Debug/ㄱㄴㄷ.dll");
    if(hInstLib == NULL){
        printf("오류: DLL을 불러올 수 없습니다.\n");
        return 1;
    }

    my_func = (ALUFunc) GetProcAddress(hInstLib, "my_add");
    if(my_func == NULL){
        printf("오류: DLL 함수를 찾을 수 없습니다.\n");
        return 1;
    }
    result = my_func(a, b);
    FreeLibrary(hInstLib);
    printf("%d", result);

    return 0;
}

 

6) "ㄱㄴㄷ"을 포함한 파일의 경로 및 이름을 바꾼다. 상대경로보다 절대경로를 추천한다.

 

입력 : 2016.08.04 11:53