SlideShare une entreprise Scribd logo
1  sur  25
dll 파일 호출
암시적 링크와 명시적 링크
일단 DLL을 하나 만들어봅시다
• Win32 프로젝트로
DLLCreateExample 이라는
프로젝트를 생성하였음
TestDll.cpp 작성
한 번 컴파일 해보면?
dll 파일이 나온다
이제 이 dll 파일을 불러오는 일이 남았다
dll 링크의 두 가지 방법
• 암시적 링크
• Static library 가져오기와 같다
• 프로세스가 시작될 때 dll을 가져옴
• 명시적 링크
• 프로세스가 실행 중일 때 dll을 가져옴
암시적 링크
• 대부분의 프로그램이 암시적 링크를 쓴다
• 왜냐? 쉽기 때문이지
• 암시적 링크에는 dll과 .lib 파일이 모두 필요하다
• 당연히 이 lib 파일은 dll 만드는데 사용한 것과 같아야 한다
• dll을 가져다 쓰는 쪽에서는 dll에 있는 어떤 함수를 사용한다고 호출을
구현하는 부분이 있어야 한다
• 귀찮으면 헤더 파일(.h)로 하나 떼서 던져주면 된다
• 프로그램이 실행될 때 DLL들을 쭉 불러와서 호출한 함수가 있는지 검사
한다
• 없으면 프로그램이 바로 죽는다!
암시적 링크
• 동적 링크된 참조가 있으면 프로그램이 실행될 때 해당 dll 파일
을 프로세스의 주소 공간에 매핑한다
• 이때 dll이 없으면 프로세스가 죽는다. 바로 위에 말한 것
• dll에 대한 진입점 함수(초기화나 종료)가 있으면 운영 체제가 그
함수를 호출한다
• 이때도 true가 반환되지 않으면 프로세스가 죽는다
• dll은 프로세스가 실행될 때 한 번 로드되고 계속 프로세스 주소
공간에 남아있다
암시적 링크 따라하기
새 솔루션을 하나 만들어봅시다
암시적 링크 따라하기
새 프로젝트에서
아까 만든 함수를 쓴다!
암시적 링크 따라하기
• 컴파일 해보면?
• 컴파일러 : 뭐 어쩌라는 건지 ^^?
암시적 링크 따라하기
• dll 파일을 주면?
똑같음^^
암시적 링크 따라하기
• lib와 dll이 둘 다 있어야 한다
• lib 파일이 어디 있는지 알려주자
• 잠깐!) 상대경로로 집어넣는 방법은 별로 안 좋다
암시적 링크 따라하기
이제 잘 나온다!
암시적 링크 따라하기
• 주의할 점
• 이 부분을 헤더에서 해결하게 하고 #include로 헤더 파일만 가져오면 귀
찮은 일을 안 해도 된다. 함수가 1000개면 1000개 다 선언할 것인가??
암시적 링크 따라하기
위쪽이 .h 파일
아래쪽이 .cpp 파일
이런 식으로 ifdef를 써서
dll을 만드는 프로젝트인지
불러오는 프로젝트인지 판단
암시적 링크 따라하기
Dll을 만들었던 .h
파일을 가져오면
함수를 하나하나 선언할
필요가 없어진다
물론 이렇게 상대경로로
가져오는 방법은 안 좋다
암시적 링크 따라하기
• 주의할 점 2
• #pragma comment 말고 프로젝트 종속성에 lib 파일을 추가해도 된다
• 이건 static library 만드는 거랑 똑같아서 따로 설명하진 않음
• 외부에서 제공한 dll이 아니라 직접 만들어서 쓰는 dll이면 같은 솔루션
안에 프로젝트로 넣어 놓고 작업하는 편이 좋다
명시적 링크
• 명시적 링크가 필요한 상황들이 있다
• 실행 시점까지 무슨 dll을 불러올지 모르는 경우
• 예를 들어 설정 파일에 따라 불러올 dll이 바뀌거나 하는 경우
• 암시적 링크는 dllmain 함수에 오류가 있거나, 해당 dll이 없으면
프로세스가 바로 죽는다
• 명시적 링크는 이런 상황에서 경로를 다시 설정하도록 하는 등 프로세스
가 에러에서 복구될 수 있는 기회를 준다
명시적 링크
• dll을 많이 불러오는 프로세스는 암시적 링크로 만들었을 때 dll
로드에 시간이 많이 든다
• 실행 속도를 높이기 위해 즉시 사용할 함수들을 명시적으로 불러오고 나
머지 dll 파일을 암시적으로 가져올 수 있다
• 필요 없는 dll은 실행 도중에 해제할 수도 있다
• 프로그램과 import library 사이의 연결이 필요 없다
• 어차피 실행 도중에 불려오니까…
명시적 연결 따라하기
• 세 가지 함수가 필요하다
• LoadLibrary
• 프로세스 내 주소 공간에 dll을 할당하는 함수이다
• 실패하면 NULL을 반환함
• DLL 파일의 usage count를 1씩 증가시킨다
• GetProcAddress
• Export된 심볼의 시작 주소를 얻어온다
• FreeLibrary
• DLL 파일의 usage count를 1씩 감소시키고, 0이 되면 파일 이미지를 매핑 해제
명시적 연결 따라하기
• 암시적 연결과 비슷하게 헤더 파일을 가져와서 사용하는 함수 하
나를 만든다
당연히 안 된다
명시적 연결 따라하기
함수 포인터를 선언한다
여기에 dll의 함수를 매핑
시켜서 사용한다
명시적 연결 따라하기
LoadLibraryA로 dll을 불러온다
hMod가 NULL이면 실패한 것이다
명시적 연결 따라하기
DLL 파일에서 해당 함수를 찾아서 시작 주소를 pFunction에 매핑시킨다
두 함수 모두 리턴과 인자가 같기 때문에 그냥 변수 하나에 쓸 수 있다
마지막에 FreeLibrary도 잊지 말자
명시적 연결 따라하기
• 잘 된다

Contenu connexe

Tendances

[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015NAVER / MusicPlatform
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁Yi-kwon Hwang
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)Heungsub Lee
 
ROP 輕鬆談
ROP 輕鬆談ROP 輕鬆談
ROP 輕鬆談hackstuff
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCPSeungmo Koo
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...Daniel Bohannon
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들DongMin Choi
 
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"용근 권
 
Red Team Apocalypse (RVAsec Edition)
Red Team Apocalypse (RVAsec Edition)Red Team Apocalypse (RVAsec Edition)
Red Team Apocalypse (RVAsec Edition)Beau Bullock
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engineDuoyi Wu
 
Performance Analysis: The USE Method
Performance Analysis: The USE MethodPerformance Analysis: The USE Method
Performance Analysis: The USE MethodBrendan Gregg
 
Python's magic methods
Python's magic methodsPython's magic methods
Python's magic methodsReuven Lerner
 
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...François-Guillaume Ribreau
 

Tendances (20)

[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
ROP 輕鬆談
ROP 輕鬆談ROP 輕鬆談
ROP 輕鬆談
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP게임서버프로그래밍 #1 - IOCP
게임서버프로그래밍 #1 - IOCP
 
Django Celery
Django Celery Django Celery
Django Celery
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
Invoke-CradleCrafter: Moar PowerShell obFUsk8tion & Detection (@('Tech','niqu...
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
 
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
 
Red Team Apocalypse (RVAsec Edition)
Red Team Apocalypse (RVAsec Edition)Red Team Apocalypse (RVAsec Edition)
Red Team Apocalypse (RVAsec Edition)
 
Virtual machine and javascript engine
Virtual machine and javascript engineVirtual machine and javascript engine
Virtual machine and javascript engine
 
NiFi 시작하기
NiFi 시작하기NiFi 시작하기
NiFi 시작하기
 
Performance Analysis: The USE Method
Performance Analysis: The USE MethodPerformance Analysis: The USE Method
Performance Analysis: The USE Method
 
Python's magic methods
Python's magic methodsPython's magic methods
Python's magic methods
 
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...Choisir entre une API  RPC, SOAP, REST, GraphQL?  
Et si le problème était ai...
Choisir entre une API RPC, SOAP, REST, GraphQL? 
Et si le problème était ai...
 

En vedette

Dll파일 호출
Dll파일 호출Dll파일 호출
Dll파일 호출abapier
 
C++과 Lua script연동
C++과 Lua script연동C++과 Lua script연동
C++과 Lua script연동선협 이
 
C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2진상 문
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback흥배 최
 
게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴MinGeun Park
 
C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)지환 김
 
2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안
2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안
2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안Suji Lee
 
[공간정보연구원] 1일차 - QGIS 개요 및 기초
[공간정보연구원] 1일차 - QGIS 개요 및 기초[공간정보연구원] 1일차 - QGIS 개요 및 기초
[공간정보연구원] 1일차 - QGIS 개요 및 기초slhead1
 
공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발MinPa Lee
 
보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법Youngjun Chang
 
PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판
PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판 PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판
PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판 SANGHEE SHIN
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기Sang Heon Lee
 
악성코드 분석 도구
악성코드 분석 도구악성코드 분석 도구
악성코드 분석 도구Youngjun Chang
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
Ccx03.cocos builder
Ccx03.cocos builderCcx03.cocos builder
Ccx03.cocos builder우진 이
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)SeungIl Choi
 
GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터Mark Choi
 
[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기Sun Park
 

En vedette (20)

Dll파일 호출
Dll파일 호출Dll파일 호출
Dll파일 호출
 
C++과 Lua script연동
C++과 Lua script연동C++과 Lua script연동
C++과 Lua script연동
 
04 dll 분석
04 dll 분석04 dll 분석
04 dll 분석
 
C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2C# 뉴비를 위한 맛보기 2
C# 뉴비를 위한 맛보기 2
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴
 
C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)C#으로 게임 엔진 만들기(1)
C#으로 게임 엔진 만들기(1)
 
2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안
2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안
2015 SINVAS USER CONFERENCE - SPL/SSPL을 통한 임베디드 소프트웨어 개발방안
 
[공간정보연구원] 1일차 - QGIS 개요 및 기초
[공간정보연구원] 1일차 - QGIS 개요 및 기초[공간정보연구원] 1일차 - QGIS 개요 및 기초
[공간정보연구원] 1일차 - QGIS 개요 및 기초
 
공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발
 
보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법
 
PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판
PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판 PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판
PyQGIS 개발자 쿡북(PyQGIS Developer Cookbook) 한국어 판
 
[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기[NDC2016] TERA 서버의 Modern C++ 활용기
[NDC2016] TERA 서버의 Modern C++ 활용기
 
악성코드 분석 도구
악성코드 분석 도구악성코드 분석 도구
악성코드 분석 도구
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
Ccx03.cocos builder
Ccx03.cocos builderCcx03.cocos builder
Ccx03.cocos builder
 
Cocos2d x a to z (상)
Cocos2d x a to z (상)Cocos2d x a to z (상)
Cocos2d x a to z (상)
 
GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터GameMath-Chapter 01 벡터
GameMath-Chapter 01 벡터
 
[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기[NDC14] 파워포인트로 그래픽 리소스 만들기
[NDC14] 파워포인트로 그래픽 리소스 만들기
 
투영 공식
투영 공식투영 공식
투영 공식
 

Similaire à Dll 파일 호출의 2가지 방법

19_DLL의 기본.pptx
19_DLL의 기본.pptx19_DLL의 기본.pptx
19_DLL의 기본.pptxssuser0c2478
 
Windows reversing study_basic_6
Windows reversing study_basic_6Windows reversing study_basic_6
Windows reversing study_basic_6Jinkyoung Kim
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxHolyTak
 
오래된 프로젝트에 Jenkins 적용해보기
오래된 프로젝트에 Jenkins 적용해보기오래된 프로젝트에 Jenkins 적용해보기
오래된 프로젝트에 Jenkins 적용해보기용호 최
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반arundine
 
Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기
Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기
Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기KyeongmanKang
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스
 
Github 으로 학교 팀 프로젝트 하기
Github 으로 학교 팀 프로젝트 하기Github 으로 학교 팀 프로젝트 하기
Github 으로 학교 팀 프로젝트 하기nexusz99
 
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)NAVER D2
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013devCAT Studio, NEXON
 
LinqPad for DevOps
LinqPad for DevOpsLinqPad for DevOps
LinqPad for DevOps성수 이
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3형석 김
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Dong Chan Shin
 
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017devCAT Studio, NEXON
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018devCAT Studio, NEXON
 
C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)지환 김
 
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기nexusz99
 
How to use Github? (For Cien)
How to use Github? (For Cien)How to use Github? (For Cien)
How to use Github? (For Cien)민수 김
 

Similaire à Dll 파일 호출의 2가지 방법 (20)

19_DLL의 기본.pptx
19_DLL의 기본.pptx19_DLL의 기본.pptx
19_DLL의 기본.pptx
 
Windows reversing study_basic_6
Windows reversing study_basic_6Windows reversing study_basic_6
Windows reversing study_basic_6
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptx
 
System+os study 4
System+os study 4System+os study 4
System+os study 4
 
오래된 프로젝트에 Jenkins 적용해보기
오래된 프로젝트에 Jenkins 적용해보기오래된 프로젝트에 Jenkins 적용해보기
오래된 프로젝트에 Jenkins 적용해보기
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반
 
Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기
Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기
Jira + Confluence + Bitbucket으로 이슈 트래킹 걸음마 떼기
 
Dll 하이재킹
Dll 하이재킹Dll 하이재킹
Dll 하이재킹
 
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
2015 SW마에스트로 100+ 컨퍼런스_오픈스택 Swift로 시작하는 오픈소스 분석 삽질기
 
Github 으로 학교 팀 프로젝트 하기
Github 으로 학교 팀 프로젝트 하기Github 으로 학교 팀 프로젝트 하기
Github 으로 학교 팀 프로젝트 하기
 
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
LinqPad for DevOps
LinqPad for DevOpsLinqPad for DevOps
LinqPad for DevOps
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1
 
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
이승재, 박경재, NDC Replay 제작기: static website, static backoffice, NDC2017
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)C#으로 게임 엔진 만들기(2)
C#으로 게임 엔진 만들기(2)
 
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
[ 2015 SOSCON ]오픈스택 swift로 시작하는 오픈소스 분석 삽질기
 
How to use Github? (For Cien)
How to use Github? (For Cien)How to use Github? (For Cien)
How to use Github? (For Cien)
 

Plus de 진상 문

Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2진상 문
 
[C++ beginner] sizeof()
[C++ beginner] sizeof()[C++ beginner] sizeof()
[C++ beginner] sizeof()진상 문
 
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1진상 문
 
Pervasive computing
Pervasive computingPervasive computing
Pervasive computing진상 문
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?진상 문
 
C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기진상 문
 
무중력 상태에 필요한 기초 물리
무중력 상태에 필요한 기초 물리무중력 상태에 필요한 기초 물리
무중력 상태에 필요한 기초 물리진상 문
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver진상 문
 
Halo ce anniversary Postmortem
Halo ce anniversary PostmortemHalo ce anniversary Postmortem
Halo ce anniversary Postmortem진상 문
 

Plus de 진상 문 (9)

Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
 
[C++ beginner] sizeof()
[C++ beginner] sizeof()[C++ beginner] sizeof()
[C++ beginner] sizeof()
 
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
 
Pervasive computing
Pervasive computingPervasive computing
Pervasive computing
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?
 
C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기
 
무중력 상태에 필요한 기초 물리
무중력 상태에 필요한 기초 물리무중력 상태에 필요한 기초 물리
무중력 상태에 필요한 기초 물리
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver
 
Halo ce anniversary Postmortem
Halo ce anniversary PostmortemHalo ce anniversary Postmortem
Halo ce anniversary Postmortem
 

Dll 파일 호출의 2가지 방법

  • 1. dll 파일 호출 암시적 링크와 명시적 링크
  • 2. 일단 DLL을 하나 만들어봅시다 • Win32 프로젝트로 DLLCreateExample 이라는 프로젝트를 생성하였음
  • 4. 한 번 컴파일 해보면? dll 파일이 나온다 이제 이 dll 파일을 불러오는 일이 남았다
  • 5. dll 링크의 두 가지 방법 • 암시적 링크 • Static library 가져오기와 같다 • 프로세스가 시작될 때 dll을 가져옴 • 명시적 링크 • 프로세스가 실행 중일 때 dll을 가져옴
  • 6. 암시적 링크 • 대부분의 프로그램이 암시적 링크를 쓴다 • 왜냐? 쉽기 때문이지 • 암시적 링크에는 dll과 .lib 파일이 모두 필요하다 • 당연히 이 lib 파일은 dll 만드는데 사용한 것과 같아야 한다 • dll을 가져다 쓰는 쪽에서는 dll에 있는 어떤 함수를 사용한다고 호출을 구현하는 부분이 있어야 한다 • 귀찮으면 헤더 파일(.h)로 하나 떼서 던져주면 된다 • 프로그램이 실행될 때 DLL들을 쭉 불러와서 호출한 함수가 있는지 검사 한다 • 없으면 프로그램이 바로 죽는다!
  • 7. 암시적 링크 • 동적 링크된 참조가 있으면 프로그램이 실행될 때 해당 dll 파일 을 프로세스의 주소 공간에 매핑한다 • 이때 dll이 없으면 프로세스가 죽는다. 바로 위에 말한 것 • dll에 대한 진입점 함수(초기화나 종료)가 있으면 운영 체제가 그 함수를 호출한다 • 이때도 true가 반환되지 않으면 프로세스가 죽는다 • dll은 프로세스가 실행될 때 한 번 로드되고 계속 프로세스 주소 공간에 남아있다
  • 8. 암시적 링크 따라하기 새 솔루션을 하나 만들어봅시다
  • 9. 암시적 링크 따라하기 새 프로젝트에서 아까 만든 함수를 쓴다!
  • 10. 암시적 링크 따라하기 • 컴파일 해보면? • 컴파일러 : 뭐 어쩌라는 건지 ^^?
  • 11. 암시적 링크 따라하기 • dll 파일을 주면? 똑같음^^
  • 12. 암시적 링크 따라하기 • lib와 dll이 둘 다 있어야 한다 • lib 파일이 어디 있는지 알려주자 • 잠깐!) 상대경로로 집어넣는 방법은 별로 안 좋다
  • 14. 암시적 링크 따라하기 • 주의할 점 • 이 부분을 헤더에서 해결하게 하고 #include로 헤더 파일만 가져오면 귀 찮은 일을 안 해도 된다. 함수가 1000개면 1000개 다 선언할 것인가??
  • 15. 암시적 링크 따라하기 위쪽이 .h 파일 아래쪽이 .cpp 파일 이런 식으로 ifdef를 써서 dll을 만드는 프로젝트인지 불러오는 프로젝트인지 판단
  • 16. 암시적 링크 따라하기 Dll을 만들었던 .h 파일을 가져오면 함수를 하나하나 선언할 필요가 없어진다 물론 이렇게 상대경로로 가져오는 방법은 안 좋다
  • 17. 암시적 링크 따라하기 • 주의할 점 2 • #pragma comment 말고 프로젝트 종속성에 lib 파일을 추가해도 된다 • 이건 static library 만드는 거랑 똑같아서 따로 설명하진 않음 • 외부에서 제공한 dll이 아니라 직접 만들어서 쓰는 dll이면 같은 솔루션 안에 프로젝트로 넣어 놓고 작업하는 편이 좋다
  • 18. 명시적 링크 • 명시적 링크가 필요한 상황들이 있다 • 실행 시점까지 무슨 dll을 불러올지 모르는 경우 • 예를 들어 설정 파일에 따라 불러올 dll이 바뀌거나 하는 경우 • 암시적 링크는 dllmain 함수에 오류가 있거나, 해당 dll이 없으면 프로세스가 바로 죽는다 • 명시적 링크는 이런 상황에서 경로를 다시 설정하도록 하는 등 프로세스 가 에러에서 복구될 수 있는 기회를 준다
  • 19. 명시적 링크 • dll을 많이 불러오는 프로세스는 암시적 링크로 만들었을 때 dll 로드에 시간이 많이 든다 • 실행 속도를 높이기 위해 즉시 사용할 함수들을 명시적으로 불러오고 나 머지 dll 파일을 암시적으로 가져올 수 있다 • 필요 없는 dll은 실행 도중에 해제할 수도 있다 • 프로그램과 import library 사이의 연결이 필요 없다 • 어차피 실행 도중에 불려오니까…
  • 20. 명시적 연결 따라하기 • 세 가지 함수가 필요하다 • LoadLibrary • 프로세스 내 주소 공간에 dll을 할당하는 함수이다 • 실패하면 NULL을 반환함 • DLL 파일의 usage count를 1씩 증가시킨다 • GetProcAddress • Export된 심볼의 시작 주소를 얻어온다 • FreeLibrary • DLL 파일의 usage count를 1씩 감소시키고, 0이 되면 파일 이미지를 매핑 해제
  • 21. 명시적 연결 따라하기 • 암시적 연결과 비슷하게 헤더 파일을 가져와서 사용하는 함수 하 나를 만든다 당연히 안 된다
  • 22. 명시적 연결 따라하기 함수 포인터를 선언한다 여기에 dll의 함수를 매핑 시켜서 사용한다
  • 23. 명시적 연결 따라하기 LoadLibraryA로 dll을 불러온다 hMod가 NULL이면 실패한 것이다
  • 24. 명시적 연결 따라하기 DLL 파일에서 해당 함수를 찾아서 시작 주소를 pFunction에 매핑시킨다 두 함수 모두 리턴과 인자가 같기 때문에 그냥 변수 하나에 쓸 수 있다 마지막에 FreeLibrary도 잊지 말자