'implicit'에 해당되는 글 2건

  1. 2009.04.23 DLL 제작 (Implicit 연결)
  2. 2009.04.23 DLL 이란...
2009. 4. 23. 22:17

DLL 제작 (Implicit 연결)



DLL 제작
단순히 DLL 파일을 생성하는 방법이다. DLL은 단독으로 실행될 수 없으므로 이 파일을 가지고 테스트를 할 수는 없다.(테스트 프로그램을 따로 제작할 것이다.)

1. Visual Studio를 실행한다.(본인의 경우 Visual Studio 2005 임)
2. File -> New -> Project..
3. New Project 위자드
   - Visual C++ 탭에서 Win32를 선택하고, 템플릿으론 Win32 Project를 선택한다.
   - Name, Location, Solution Name는 알아서 대충 넣어준다..
4. 대충 Next 버튼을 클릭하며, Application Settings에서는  DLL을 선택한다.
5. Finish 버튼 클릭!!
6. 새프로젝트가 만들어지면, .cpp파일을 하나 생성하고, 테스트용으로 간단한 내용을 입력한다.
// 윈도우즈 API 완전정복의 코드임..
// a, b를 입력받아 a, b의 합을 리턴하는 코드임
// 다른 프로그램에서 이 함수를 사용할 수 있도록 extern "C"__declspec를 사용..
extern "C"__declspec(dllexport) int AddInteger(int a, int b)
{
    return a+b;
}

7. 이 프로젝트를 컴파일하면 해당하는 .dll과 .lib 파일이 생성된다.


DLL 테스트 프로그램 제작
Implicit(암시적), Explicit(묵시적) 연결을 사용할 수 있다.

Implicit(암시적) 연결
MyDllTest라는 API 프로젝트를 만들고 다래 코드를 추가한다.

// DLL  함수를 위해 추가해야 하는 부분..
extern "C"__declspec(dllimport) int AddInteger(int, int);
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    TCHAR str[128];

    switch (iMessage) {
    case WM_CREATE:
        hWndMain=hWnd;
        return 0;
    case WM_PAINT:
        hdc=BeginPaint(hWnd, &ps);
        wsprintf(str, "1+2 = %d", AddInteger(1, 2));
        TextOut(hdc, 10, 10, str, lstrlen(str));
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
       return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


다음은 사용하고자 하는 DLL의 임포트 라이브러리를 프로젝트에 포함시키는 작업을 해주어야 한다.
메뉴 탭의 Project -> XXXProperties.. (이미지 클릭 하셈!!! ㅋ)


마지막으로 .DLL 파일과 .lib 파일을 MyDllTest 프로젝트 디렉토리로 복사한다.
참고로 .DLL과 .lib 파일은 위에서 DLL 제작의 컴파일 결과물로 생성된 녀석들이다.


이 방법 말고도, DLL을 사용하려는 소스의 윗부분에 #pragma 문을 사용할 수도 있다.
#pragma comment(lib,"XXXDLL.lib") 를 추가하면 된다.
#pragma 지시자를 사용하면 컴파일러의 라이브러리 관리 모듈에게 XXXDLL.lib를 검색하도록 하게 하므로 위의 과정에서 보인것과 같은 설정 대화상자나 파일(.dll, .lib) 추가 없이 소스에서 곧바로 임포트 라이브러리를 지정할 수 있다.


그리고 컴파일... 후 실행하면..



추가로  DLL의 헤더파일을 정의해서 깔끔하게 DLL을 작성하는 방법이다.

위와 같이 함수의 내용이 얼마 되지 않는다면 그냥 사용할 수 있겠지만, DLL에 추가되는 함수의 수가 많아지게 되면, 선언의 꺼리(extern "C"__declspec..와 같은)가 그만큼 많아질 것이다.
헤더파일을 하나 만들어 선언을 모두 옮겨 놓는 방법도 하나의 해결 방안이 될 듯..

DLL의 프로젝트에 헤더파일 하나를 만든다.
그리고 아래와 같은 내용을 추가한다.

//XXX.h

#ifdef DLLEXPORT
#define MYDLLTYPE __declspec(dllexport)
#else
#define MYDLLTYPE __declspec(dllimport)
#endif

extern "C" MYDLLTYPE int AddInteger(int a, int b);

추가로 DLL에 함수를 추가하고자 한다면, 함수의 선언 부분을 extern "C" .. 의 아래에 추가시켜주면 될 것이다.

DLL의 .cpp 파일을 열어서 다음의 두줄을 추가한다.

#define DLLEXPORT             // DLL Export임을 선언(??)
#include "XXX.h"

이 두줄을 추가시키므로 인해서, DLL은 export 하는 용도임을 정의한다.

테스트 프로그램은 단지 XXX.h파일을 추가시켜준다.
어떠한 정의가 따로 되어있지 않으므로, __declspec(dllimport)로 인식할 것이다.


여기까지!!

이게 DLL을 사용하는 가장 간편한 방법이라고 하는데..
다른 방법들은.. 다음 이시간에.. !!!


'Programmings > Windows Programming' 카테고리의 다른 글

DllMain  (0) 2009.04.27
DLL 제작 (Explicit)  (0) 2009.04.24
DLL 이란...  (0) 2009.04.23
아스키 코드표  (0) 2009.03.03
프로그램 실행 에러 - MFC71D.DLL을(를) 찾을 수 없으므로...  (5) 2009.02.05
2009. 4. 23. 18:30

DLL 이란...



DLL(Dynamic Link)라는 것.. 동적 링크라고도 하는 이넘은... 컴파일시 함수의 코드가 실행 파일에 그대로 복사되는 것이아니고, 실행되는 파일이 실행 될 때 필요로 하는 함수가 실행 파일에 연결되는 형식이다. 실행파일은 단지 호출할 함수의 정보만 포함되고 실제 함수코드는 복사되지 않기 때문에 실행 파일의 크기가 작아진다. 하지만 실행시킬 루틴이 필요하기 때문에 실행파일은 실행시킬 함수에 대한 정보를 가지고 있어야하고, 실행시킬 함수는 DLL 파일의 형태로 존재하게 된다.

장점
1. 한 코드를 여러 프로그램이 같이 사용하기 때문에 메모리가 절약된다.
2. DLL을 사용하는 프로그램은 실행파일 자체에 해당 함수가 포함되지 않기에 크기가 작다.
3. 함수의 루틴을 바꾸고자(업그레이드) 할 경우 해당하는 DLL만 수정하면 된다.
...
이외에도 많은 장점들이 있는듯함..

단점
1. DLL 없이 실행프로그램 자체만으론 동작을 안한다. -_-;
2. DLL 이 교체되거나 하면, 프로그램이 정상동작을 안할 수도 있다.
... 등등..

DLL 연결 방법
1. 암시적(Implicit) 연결

함수가 어느  DLL에 있는지 밝히지 않고 그냥 사용을 하는 방법이다. DLL을 사용하려는 프로젝트는 해당 dll과 lib를 포함하고 있어야 하고, 윈도우즈는 임포트 라이브러리의 정보를 참조해서 해당 DLL을 로드하고 함수를 찾게 된다.
프로그램이 실행될 때 DLL이 로드되므로 실행시 연결(Load time Linking)이라고 한다.
2. 명시적(Explicit) 연결
어느 DLL에 있는 함수인지를 밝히고 사용하는 방법이다. 프로그램이 실행될 때 DLL이 로드되는 것이 아니라 로드하라는 명령이 있을 때만 해당 DLL이 로드된다. 함수가 속해있는 DLL의 이름을 명시적으로 지정하여 호출하므로 임포트 라이브러리는 필요하지 않다.
프로그램이 실행 중에 DLL이 메모리로 읽혀지기 때문에 실행중 연결(Run Time Linking)이라고 한다.