25
dll 파파 파파 파파파 파파파 파파파 파파

Dll 파일 호출의 2가지 방법

  • Upload
    -

  • View
    2.049

  • Download
    6

Embed Size (px)

Citation preview

Page 1: Dll 파일 호출의 2가지 방법

dll 파일 호출암시적 링크와 명시적 링크

Page 2: Dll 파일 호출의 2가지 방법

일단 DLL 을 하나 만들어봅시다• Win32 프로젝트로 DLL-

CreateExample 이라는 프로젝트를 생성하였음

Page 3: Dll 파일 호출의 2가지 방법

TestDll.cpp 작성

Page 4: Dll 파일 호출의 2가지 방법

한 번 컴파일 해보면 ?

dll 파일이 나온다

이제 이 dll 파일을 불러오는 일이 남았다

Page 5: Dll 파일 호출의 2가지 방법

dll 링크의 두 가지 방법• 암시적 링크• Static library 가져오기와 같다• 프로세스가 시작될 때 dll 을 가져옴

• 명시적 링크• 프로세스가 실행 중일 때 dll 을 가져옴

Page 6: Dll 파일 호출의 2가지 방법

암시적 링크• 대부분의 프로그램이 암시적 링크를 쓴다• 왜냐 ? 쉽기 때문이지

• 암시적 링크에는 dll 과 .lib 파일이 모두 필요하다• 당연히 이 lib 파일은 dll 만드는데 사용한 것과 같아야 한다• dll 을 가져다 쓰는 쪽에서는 dll 에 있는 어떤 함수를 사용한다고 호출을

구현하는 부분이 있어야 한다• 귀찮으면 헤더 파일 (.h) 로 하나 떼서 던져주면 된다

• 프로그램이 실행될 때 DLL 들을 쭉 불러와서 호출한 함수가 있는지 검사한다• 없으면 프로그램이 바로 죽는다 !

Page 7: Dll 파일 호출의 2가지 방법

암시적 링크• 동적 링크된 참조가 있으면 프로그램이 실행될 때 해당 dll 파일을

프로세스의 주소 공간에 매핑한다• 이때 dll 이 없으면 프로세스가 죽는다 . 바로 위에 말한 것

• dll 에 대한 진입점 함수 ( 초기화나 종료 ) 가 있으면 운영 체제가 그 함수를 호출한다• 이때도 true 가 반환되지 않으면 프로세스가 죽는다

• dll 은 프로세스가 실행될 때 한 번 로드되고 계속 프로세스 주소 공간에 남아있다

Page 8: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기

새 솔루션을 하나 만들어봅시다

Page 9: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기

새 프로젝트에서아까 만든 함수를 쓴다 !

Page 10: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기• 컴파일 해보면 ?

• 컴파일러 : 뭐 어쩌라는 건지 ^^?

Page 11: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기• dll 파일을 주면 ?

똑같음 ^^

Page 12: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기• lib 와 dll 이 둘 다 있어야 한다• lib 파일이 어디 있는지 알려주자

• 잠깐 !) 상대경로로 집어넣는 방법은 별로 안 좋다

Page 13: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기

이제 잘 나온다 !

Page 14: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기• 주의할 점• 이 부분을 헤더에서 해결하게 하고 #include 로 헤더 파일만 가져오면

귀찮은 일을 안 해도 된다 . 함수가 1000 개면 1000 개 다 선언할 것인가 ??

Page 15: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기

위쪽이 .h 파일

아래쪽이 .cpp 파일

이런 식으로 ifdef 를 써서

dll 을 만드는 프로젝트인지불러오는 프로젝트인지 판단

Page 16: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기

Dll 을 만들었던 .h파일을 가져오면

함수를 하나하나 선언할필요가 없어진다

물론 이렇게 상대경로로가져오는 방법은 안 좋다

Page 17: Dll 파일 호출의 2가지 방법

암시적 링크 따라하기• 주의할 점 2• #pragma comment 말고 프로젝트 종속성에 lib 파일을 추가해도 된다• 이건 static library 만드는 거랑 똑같아서 따로 설명하진 않음• 외부에서 제공한 dll 이 아니라 직접 만들어서 쓰는 dll 이면 같은 솔루션

안에 프로젝트로 넣어 놓고 작업하는 편이 좋다

Page 18: Dll 파일 호출의 2가지 방법

명시적 링크• 명시적 링크가 필요한 상황들이 있다• 실행 시점까지 무슨 dll 을 불러올지 모르는 경우• 예를 들어 설정 파일에 따라 불러올 dll 이 바뀌거나 하는 경우

• 암시적 링크는 dllmain 함수에 오류가 있거나 , 해당 dll 이 없으면 프로세스가 바로 죽는다• 명시적 링크는 이런 상황에서 경로를 다시 설정하도록 하는 등 프로세스가

에러에서 복구될 수 있는 기회를 준다

Page 19: Dll 파일 호출의 2가지 방법

명시적 링크• dll 을 많이 불러오는 프로세스는 암시적 링크로 만들었을 때 dll

로드에 시간이 많이 든다• 실행 속도를 높이기 위해 즉시 사용할 함수들을 명시적으로 불러오고 나머지

dll 파일을 암시적으로 가져올 수 있다• 필요 없는 dll 은 실행 도중에 해제할 수도 있다

• 프로그램과 import library 사이의 연결이 필요 없다• 어차피 실행 도중에 불려오니까…

Page 20: Dll 파일 호출의 2가지 방법

명시적 연결 따라하기• 세 가지 함수가 필요하다• LoadLibrary

• 프로세스 내 주소 공간에 dll 을 할당하는 함수이다• 실패하면 NULL 을 반환함• DLL 파일의 usage count 를 1 씩 증가시킨다

• GetProcAddress• Export 된 심볼의 시작 주소를 얻어온다

• FreeLibrary• DLL 파일의 usage count 를 1 씩 감소시키고 , 0 이 되면 파일 이미지를 매핑 해제

Page 21: Dll 파일 호출의 2가지 방법

명시적 연결 따라하기• 암시적 연결과 비슷하게 헤더 파일을 가져와서 사용하는 함수 하나를

만든다

당연히 안 된다

Page 22: Dll 파일 호출의 2가지 방법

명시적 연결 따라하기

함수 포인터를 선언한다여기에 dll 의 함수를 매핑시켜서 사용한다

Page 23: Dll 파일 호출의 2가지 방법

명시적 연결 따라하기

LoadLibraryA 로 dll 을 불러온다hMod 가 NULL 이면 실패한 것이다

Page 24: Dll 파일 호출의 2가지 방법

명시적 연결 따라하기

DLL 파일에서 해당 함수를 찾아서 시작 주소를 pFunction 에 매핑시킨다두 함수 모두 리턴과 인자가 같기 때문에 그냥 변수 하나에 쓸 수 있다

마지막에 FreeLibrary 도 잊지 말자

Page 25: Dll 파일 호출의 2가지 방법

명시적 연결 따라하기• 잘 된다