수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1693843
  • Today | 194
  • Yesterday | 588

Programming/Win32 API2007/03/23 17:31

DLL 에 대해서 알아보자.

원본 : http://www.debuglab.com/knowledge/dllabout.html

1.요약

Dynamic Linked Library 에 대해서 알아봅시다.


2.본문

(1) DLL의 성격

- DLL 은 필요에 따라 동적으로 로드되고 제거될 수 있으며, DLL의 하나의 인스턴스가 여러 Application 에 의해 공유되는 것도 가능하다.


(2) 장점 과 단점

- 장점

* 실행시 로드와 제거는 DLL을 사용하는 윈도우즈 App가 메모리를 효과적으로 사용한다는 것을 말한다.
* DLL에 의한 모듈화는 코드를 독립적으로 개발하고, 테스트하고 관리할 수 있도록 해준다.
* 한번에 하나 이상의 Client에 의해서 사용될 수 있기 때문에 진정으로 코드의 공유가 가능하다.
* Programming 언어 독립적일 수 있다.

- 단점

* App가 여러개의 부분으로 나뉘어지므로, App의 일부분을 잃을 수 있다.
* App의 복잡성이 증가할 수 있다. 이것은 호환성 유지에 중요한 문제가 될 수 있다.
* 같은 DLL을 여러개 가질 수 있다. 특히, 많은 사람들이 프로그램과 함께 분배하는 공통적으로 사용되고 재분배가능한 DLL을 사용할 때 문제가 발생할 수 있다.
* DLL의 치명적인 단점은 경로와 파일명에 의존한다는 것이다.

(3) DllMain

- 함수 원형

* BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID pReserved )
* 위의 pReserved 는 DLL 이 LoadLibrary() 나 FreeLibrary() 함수에 의해서 사용될 때 NULL 이다.

- dwReason 에 따른 분류

(ㄱ) DLL_PROCESS_ATTACH : 프로세스의 Startup 이나 LoadLibrary() 함수의 사용으로 DLL 이 로드되었을때
(ㄴ) DLL_PROCESS_DETACH : 프로세스의 종료나 FreeLibrary() 함수가 호출되어 DLL 이 제거되었을때, 만약 TerminateProcess() 함수로 프로세스가 종료되었을 경우에는 호출되지 않는다.
(ㄷ) DLL_THREAD_ATTACH : 새로운 Thread를 만들때 새로운 Thread의 Context 에서 수행된다. 이 부분은 주로 TLS(Thread Local Storage)의 작업을 위해서 사용한다. 특히, 이 부분은 DLL 이 로드되고 난 후의 Thread가 시작할 때만 호출된다.
(ㄹ) DLL_THREAD_DETACH : 호출한 프로세스의 Thread가 종료될 때 수행된다. 따라서 ATTACH 보다 DETACH 의 횟수가 많을 수 있다.

- DllMain 이 필요없는 경우

만약 프로세스가 DllMain()을 작성하지 않는다면, 링커는 아무것도 실행하지 않고 단지 TRUE를 리턴하는 함수를 생성한다.


(4) DLL의 함수나 클래스를 export 하는 방법

- DEF 파일 사용

프로젝트 이름과 같은 def 파일을 생성한다.


예) dll 의 이름이 "MyDll" 일 경우

LIBRARY "MyDll" 

EXPORTS 

         Func1 @1 

         Func2 @2 

위에서 '@1' 과 같이 번호를 붙이는 경우에는 반드시 다른 함수들도 번호를 붙여야 하며, 1부터 시작해야 한다.

(장점 : DLL의 공간 절약, 보다 빠른 기호 검색, DLL의 보안성 높임)
(단점 : 다른 Win32 Platform 에서 실행되지 않을 수 있다.)

- __declspec 사용

예) 아래와 같은 define 문으로 사용할 수 있다.
#ifdef IN_DLL 

#define DLL_DECL __declspec(dllexport)   // DLL 파일 

#else 

#define DLL_DECL __declspec(dllimport)   // 실행 모듈 

#endif 

* export된 함수가 별칭을 갖기 위해서는 아래와 같이 pragma를 사용할 수 있다.

#pragma comment(linker, "/export:func1=?func1@@YYAACC")

(5) 공유 Section 만들기

예) 아래와 같이 share 라는 공유 섹션을 만들 수 있다.
#pragma comment(linker, "/section:.share , RWS") 



#pragma data_seg(".share") 

long lCount = 0; 

#pragma data_seg() 

위에서 만약 lCount를 초기화 해주지 않는 다면, lCount 는 share 라는 공유 섹션이 아니라, .bss(공통적으로 존재하는 기본 Section) 라는 초기화 되지 않은 data를 관리하는 섹션안에 포함되게 된다.

(6) 기타

- 글꼴 DLL을 제외하고는 모든 리소스 전용 DLL 이 최소한 하나의 코드 segment를 가질 필요가 있으므로 여분의 DllMain(최소코드)를 가지는 것은 코드 segment를 지원하는 방법이다.


3.예제



4.참고

Beginner WindowsNT Programming 2장 DLL 부분



- 2001.08.19 Smile Seo -
"Win32 API" 카테고리의 다른 글
  • Message Management (0)2007/04/29
  • API hooking ( Dll 바꿔치우기~) (1)2007/03/23
  • DLL 에 대해서 알아보자. (0)2007/03/23
  • 프로세스의 초기화와 종료 기다리기 (0)2007/03/23
  • Top 윈도우들의 핸들을 알수 없을까? (0)2007/03/23
2007/03/23 17:31 2007/03/23 17:31
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2744

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 505 506 507 508 509 510 511 512 513 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 배열과 포인터
  • DirectDraw
  • Apache
  • JSP
  • Performance
  • 블루투스
  • Data Mart
  • 알고리즘
  • Visual Studio 2005
  • 성공
  • robots
  • 윈도우즈 종료
  • 까무스
  • 연결연산자
  • 한서관
  • Development
  • 프로그램 중복 실행 방지
  • 다이어트
  • 시스템 방어
  • 가상 메모리 크기

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.