오후 1:44 1999-09-20   조경민 ( bro@shinbiro.com )
--------------------------------------------------------------------
DLL을 사용하자!
--------------------------------------------------------------------

DLL은 MFC를 보면 여러가지.. ( Regular DLL, Extend MFC DLL 등등

으로 많이 나뉘나.. ) 사실 Win32에서는 DLL은 실제 하나 뿐이다.

DLL이 무엇인가 먼저 보자..

Dynamic Liburary Link를 의미하는데 동적으로 라이브러리를 링크한다는

말이다.

즉 어떤 라이브러리 모듈 코드가 컴파일 타임시 프로그램 코드와 합쳐져서

실행되는 것이 아니라, 어던 라이브러리 모듈 코드가 런타임시(실행시간)

에 코드가 존재하는 같은 프로세스에 적재되어서 실행되는 것을 말한다.

Win32 DLL 사용하는데는 두가지 방법이 존재한다.

Export Lib를 이용한 DLL 모듈 쉽게 쓰는 방법과 DLL 파일을 그대로

실시간에 로딩하여 필요한 모듈안의 함수의 주소를 알아와서 실행하는

방법이 있다.

DLL을 만들어 보자

비주얼C++에서 애플리 위자드상에서 Simple Win32 DLL을 만들어 낸다.

그리고 함수를 다음 처럼 만들어 본다.
My라는 이름

My.h
extern "C" __declspec(dllexport) void Message();


My.cpp


void DllMain(... )
{
:
}
:

extern "C" __declspec(dllexport) void Message()
{
        MessageBox("안녕',"DLL",MB_OK);
}

그리고 F5를 눌러 실행해 보면  My.lib와 My.dll라는 파일이 생기는데

lib는 우리가 보통 아는 스태틱 라이브러리 모듈이 아니다.

단지 .def 파일에 기입된 내용들 ( 함수의 이름과 함수가 받는 파라미터

들의 바이트 크기 등등의 기본적인 Dll로 Export될 간략한 정보)

이 들어 있는 익스포트 라이브러리 파일이다. 또한 그래서 크기도 작고

실 모듈은 DLL파일 안에 존재한다.

DLL 쓰기

1. 익스포트 lib를 이용해서 쓰기

보통 프로젝트에서 Project/Setting.../Link에서

My.lib를 포함한후 My.dll을 윈도우 시스템 디렉토리 같은 DLL실행가능한

위치에 올린다.

DLL 찾는 경로

-> 먼저 현 프로그램이 있는 디렉토리를 검색
-> 윈도우 시스템 디렉토리 검색
-> 없으면 도스 환경변수 Path로 검색

그리고 My.h 을 포함한후 그냥 자기 디렉토리에 있는 듯이 쓰면된다.

함수 호출은

Message();

하면 된다.


2. 그냥 이용하기

직접 로드 라이브러리 함수와 GetProcAddress로 함수 주소를 찾아가는

방법으로 이때에는 익스포트 Lib를 포함할 필요없다.

HMODOULE hModule;                
hModule = LoadLibrury("c:\My.dll");

void (*fp)();
fp = (void (*fp)())GetProcAddress(hModule, "Message");

if( fp )
        fp();
FreeLibrary(hModule);


----------------------------------------------------------------
플러그인 설계하기

플러그 인이라는 것이 있다. 이것 역시 DLL인데 플러그 인은

장점이 같은 이름의 함수의 모듈로 여러 종류의 모듈을 마련하여(여러

DLL을 마련하여) 필요시 하나의 모듈을 이미 알려진 호출 방법에

따라서 쓰는것이다.

만일 모듈DLL의 함수를 init()과 run()과 quit()라는 함수를

만들어 놓은 것들이 m1.plg m2.plg m3.plg라고 있다고 하자

plg는 dll의 확장자만 바꾼것이다.

이 셋중 하나의 모둘을 로딩하여

HMODOULE hModule;                
hModule = LoadLibrary("m2.plg");

void (*fp)();
fp = (void (*fp)())GetProcAddress(hModule, "init");
if( fp )
        fp();                // init

fp = (void (*fp)())GetProcAddress(hModule, "run");
if( fp )
        fp();                // run

fp = (void (*fp)())GetProcAddress(hModule, "quit");
if( fp )
        fp();                // quit

FreeLibrary(hModule);        

이런 단계를 걷친다고 한다면 ( 이는 이미 어떤것이 먼저 호출 될것

이라는 '규약'이 있다 어떤 약속이다 )

이것이 바로 플러그 인이다.

그리고 좀더 범용적인 규약을 갖고 윈도우 시스템과 연관 깊게

설계한것이 바로 OLE COM (Component Object Model) 이다.

----------------------------------------------------------------
DLL에  class 넣기

먼저 애플리 위자드에서 DLL Simple Win32를 선택한다.

그리고 Insert/Class를 한후 자기만의 클래스를 추가한다.

그리고 아래처럼 코드를 짜보장

#define DLLEXP        __declspec(dllexport)

class DLLEXP CMy  
{
public:
        CMy();
        virtual ~CMy();
        
        int data;
        int get();
        void set(int a);

};

실행을 시키면 Export Lib인 My.Lib와 DLL 본체인 My.dll이 생긴다.

---------------------------------

이 DLL을 써보자~

자기 프로젝트를 열고 Project/Setting... 의 Linker 탭에서

My.Lib를 하고 Dll을 같은 디렉토리로 복사한다

또는 Lib와 Dll을 Lib는 VC Lib에.. DLL은 윈도우 시스템에 올려 놓는다.


***********************************

WIN32,_DEBUG,_WINDOWS,_MBCS,_USRDLL,TESTDD_EXPORTS
/nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TESTDD_EXPORTS" /Fp"Debug/TestDD.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

Project Options
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll

'KB > MFC/Win32' 카테고리의 다른 글

Flash SWF 파일 추출하기  (0) 2004.03.19
[mfc] 소켓 서포트 안하고 쓰기  (0) 2004.03.19
다이얼로그 베이스 DB프로그램 짜기  (0) 2004.03.19
CWinThread 간단 사용  (0) 2004.03.19
hook 설명  (0) 2004.03.19

+ Recent posts