이것저것/My_Work

DLL 학습 중

우담바라 2009. 3. 15. 15:05


※ 라이브러리 
 : 함수, 데이터, 타입 등 여러가지 프로그래밍 요소들의 집합으로, 자주 사용되는 표준적인 함수를 미리 만들어서 모아 놓은 것

  ⊙ 정적 링크 : 컴파일 시에 함수가 실행 파일에 연결. 실행 파일의 크기가 큼, 단독 실행 파일
  ⊙ 동적 링크 : 실행시에 함수가 실행 파일에 연결. 실행 파일의 크기가 작음, 단독 실행 불가능(DLL 필요)


※ DLL 동적 링크 (Dynamic Link Library )
: 동적 링크란 컴파일시에 함수의 코드가 실행 파일에 복사되는 것이 아니라 실행 중에 라이브러리에 있는 함수를 호출 하는 방법


※ 동적링크 장점
  1. 한 코드를 여러 프로그램이 동시에 사용하기 때문에 메모리가 절약
  2. DLL을 사용하는 프로그램은 크기가 작다
  3. DLL을 교체하여 프로그램의 성능을 향상 시키기 쉽다
  4. 리소스의 교체가 가능
  5. 실행 코드의 디버깅이 용이(단, DLL에는 전혀 버그가 없을 경우)
  6. 혼합 프로그래밍이 가능
  7. 프로그래머끼리 분담 작업이 용이, 재사용성 우수


(선언)
extern "C" __declspec(dllexport)  함수 원형 ;

extern "C" __declspec(dllimport)  함수 원형 ;


※ 연결 방법
   - 암시적 연결 
: 함수가 어느 DLL에 있는지 밝히지 않고 사용. 클라이언트 프로그램이 실행 될 때, DLL이 로드 되므로 실행시 연결이라고 함.
 프로젝트에 임포트 라이브러리를 포함해야 하며 윈도우즈는 임포트 라이브러리의정보를 참조하여 알아서 DLL을 로드하고 함수를 찾는다.클라이언트 프로그램이 로드될 때 DLL이 같이 로드되거나 이미 DLL 이 로드 되어 있으면 사용 카운트를 1 증가 
   - 명시적 연결
: 어느 DLL에 있는 함수 인지를 밝히고 사용. 클라이언트 프로그램 실행중에 DLL이 메모리로 읽혀지므로 실행중 연결이라고 함.  클라이언트 프로그램이 실행 될 때 DLL이 로드되는 것이 아니라 로드하라는 명령이 있을 때 로드.
 필요할 때 선택적으로 DLL을 로드하므로 상황에 따른 리소스 교체가 가능

※ 암시적 연결 ※

HelloDll.h
extern "C" __declspec(dllexport)  void HelloMes(HWND hParent);


HelloDll.c
#include <windows.h>
#include "HelloDll.h"
extern "C" __declspec(dllexport)  void HelloMes(HWND hParent)
{
MessageBox(hParent, "Hellow", "Hi", MB_OK);
}


TestClient.c

extern "C" __declspec(dllimport) void HelloMes(HWND hParent);
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
           ...
           ...
           ...
HelloMes(hWnd);
           ...
           ...
           ...
}




※ 명시적 연결 ※

(사용 함수)
HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
BOOL FreeLibrary(HMODULE hLibModule);


[예제]  ( 윈도우즈 API 정보에서 소스 발췌)

MyDll.h
#ifdef DLLEXPORT
#define MYDLLTYPE __declspec(dllexport)
#else
#define MYDLLTYPE __declspec(dllimport)

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

HelloDll.c
#define DLLEXPORT
#include "MyDll.h"

extern "C" MYDLLTYPE   int AddIntger(int a, int b);
{
return a+b;
}



LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
HINSTANCE hInst;
int (*pFunc)(int, int);
TCHAR str[128];
switch(iMessage){
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
hInst=LoadLibrary("MyDll.dll");
pFunc=(int (*)(int, int))GetProcAddress(hInst, "AddInteger");
wsprintf(str,"1+2 = %d",(*pFunc)(1,2));
TextOut(hdc,10,10,str,lstrlen(str));
FreeLibrary(hInst);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
POSTQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}







추가 할 부분 : 지연로딩, DLL 문법, 디버깅 or 프로그래밍시 VS2005 셋팅 팁 등