ݺߣ

ݺߣShare a Scribd company logo
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도 잊지 말자
명시적 연결 따라하기
• 잘 된다

More Related Content

Viewers also liked (20)

PPTX
Dll 파일 호출의 2가지 방법
진상 문
PDF
Ccx03.cocos builder
우진 이
PPT
GameMath-Chapter 01 벡터
Mark Choi
PPTX
Cocos2d x a to z (상)
SeungIl Choi
PPTX
투영 공식
cancan21st
PPTX
게임 개발자로서의 가치 창출
hongsungbock
PPTX
Dom 생성과정
abapier
PPTX
Silverlight vs flash
권 태혁
PDF
[NDC14] 파워포인트로 그래픽 리소스 만들기
Sun Park
PPT
3D Engine (ICON 2007)
SeongWan Kim
PPTX
4.5붶동소수점
JaeHong Park
PPTX
Chapter 2, 선형 변환과 행렬 1/2
Thisisone Lee
PPT
GameMath-Chapter 13 발사체
Mark Choi
PPTX
이권일 Sse 를 이용한 최적화와 실제 사용 예
zupet
PDF
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
JiUng Choi
PPTX
[조진현]Kgc2012 c++amp
진현 조
PPTX
알고리즘 스터디 NP-완비
SeungMin Yang
PPTX
[C++ lab] 9. 디버깅 테크닉
MinGeun Park
PPTX
Digital lighting and rendering
JaeHong Park
PPTX
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
진상 문
Dll 파일 호출의 2가지 방법
진상 문
Ccx03.cocos builder
우진 이
GameMath-Chapter 01 벡터
Mark Choi
Cocos2d x a to z (상)
SeungIl Choi
투영 공식
cancan21st
게임 개발자로서의 가치 창출
hongsungbock
Dom 생성과정
abapier
Silverlight vs flash
권 태혁
[NDC14] 파워포인트로 그래픽 리소스 만들기
Sun Park
3D Engine (ICON 2007)
SeongWan Kim
4.5붶동소수점
JaeHong Park
Chapter 2, 선형 변환과 행렬 1/2
Thisisone Lee
GameMath-Chapter 13 발사체
Mark Choi
이권일 Sse 를 이용한 최적화와 실제 사용 예
zupet
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
JiUng Choi
[조진현]Kgc2012 c++amp
진현 조
알고리즘 스터디 NP-완비
SeungMin Yang
[C++ lab] 9. 디버깅 테크닉
MinGeun Park
Digital lighting and rendering
JaeHong Park
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part2
진상 문

Similar to Dll파일 호출 (20)

PPTX
Windows reversing study_basic_6
J J
PPTX
System+os study 4
J J
PPTX
Dependency hell과 빌드지옥 탈출
Byeongsu Kang
PDF
ղѳ트러블슈팅.
kwbak
PPTX
Pwnable study basic_2
J J
PDF
Dll 하이재킹
Seungyong Lee
PPTX
Windows reversing study_basic_5
J J
PPT
2006 03 15_pe & api hook
용환 노
PPTX
Std bind
문익 장
PDF
Exception&log
Nam Hyeonuk
PDF
06장 함수
유석 남
PPTX
[170403 2주차]C언어 A반
arundine
PDF
3 1. preprocessor, math, stdlib
웅식 전
PPTX
Linux reversing study_basic_1
J J
PPTX
[0618구경원]초보 게임프로그래머를 위한 c++
KyeongWon Koo
PDF
2. windows system과 file format
Youngjun Chang
PPTX
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
PPTX
04 프로세스
ssuser3fb17c
PDF
6 function
웅식 전
PDF
Function calling convention
Yuk SeungChan
Windows reversing study_basic_6
J J
System+os study 4
J J
Dependency hell과 빌드지옥 탈출
Byeongsu Kang
ղѳ트러블슈팅.
kwbak
Pwnable study basic_2
J J
Dll 하이재킹
Seungyong Lee
Windows reversing study_basic_5
J J
2006 03 15_pe & api hook
용환 노
Std bind
문익 장
Exception&log
Nam Hyeonuk
06장 함수
유석 남
[170403 2주차]C언어 A반
arundine
3 1. preprocessor, math, stdlib
웅식 전
Linux reversing study_basic_1
J J
[0618구경원]초보 게임프로그래머를 위한 c++
KyeongWon Koo
2. windows system과 file format
Youngjun Chang
[아꿈사] The C++ Programming Language 9장 소스 파일과 프로그램
04 프로세스
ssuser3fb17c
6 function
웅식 전
Function calling convention
Yuk SeungChan
Ad

Dll파일 호출

  • 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도 잊지 말자