윈도우즈 코어 프로그래밍 - DLL 고급

5202 단어

윈도우즈 코어 프로그래밍 - DLL 고급


DLL의 진입점 함수
D L L 하나에 단일 진입점 함수를 가질 수 있습니다.시스템은 서로 다른 시간에 이 진입점 함수를 호출하는데, 이 문제는 아래에서 소개할 것이다.이러한 호출은 일반적으로 모든 프로세스나 스레드를 초기화하고 제거하는 데 사용되는 DL L에 대한 정보를 제공하는 데 사용될 수 있습니다.만약 당신의 D L L이 이러한 알림 정보를 필요로 하지 않는다면, D L L 소스 코드에서 이 함수를 실현할 필요가 없습니다.예를 들어, 리소스만 포함하는 D L L을 만들면 함수를 구현할 필요가 없습니다.공지 정보를 D L L에서 받아야 하는 경우 다음과 같은 엔트리 포인트 함수를 사용할 수 있습니다.
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad)
{
   switch(fdwReason) 
   {
      case DLL_PROCESS_ATTACH:
         //The DLL is being mapped into the process's address space.
         break;

      case DLL_THREAD_ATTACH:
         //A thread is being created.
         break;

      case DLL_THREAD_DETACH:
         //A thread is exiting cleanly.
         break;

      case DLL_PROCESS_DETACH:
         //The DLL is being unmapped from the process's address space.
         break;
   }
   return(TRUE);  // Used only for DLL_PROCESS_ATTACH
}

함수 이름 D l l M a i n은 대소문자를 구분합니다.
h i n s t D l 매개변수는 D L L의 인스턴스 핸들을 포함합니다.(w) Wi n M a i n 함수의 h i n s t E x e 매개 변수와 마찬가지로 이 값은 D L 파일 이미지가 프로세스의 주소 공간에 매핑되는 가상 메모리 주소를 식별하는 데 사용됩니다.일반적으로 이 매개 변수는 글로벌 변수에 저장해야 합니다. 그러면 리소스를 로드하는 함수(예: D i a l o g B o x, L o a d S t r i n g)를 호출할 때 사용할 수 있습니다.마지막 매개변수는 f I m p L o a d이며, D L L이 은연중에 로드된 경우 0이 아닌 값이 됩니다. D L L이 명시적으로 로드된 경우 값은 0입니다.
fd w R e a s o n 매개변수는 시스템에서 함수를 호출하는 이유를 나타냅니다.이 매개 변수는 네 개의 값 중 하나를 사용할 수 있다.이 네 가지 값은: D L LP R O C E S S _ AT TA C H、D L L _ P R O C E S S _ D E TA C H、D L L _ T H R E A D _ AT TA C H 또는 D L LT H R E A D _ D E TA C H.이러한 값은 아래에 설명되어 있습니다.
D L L은 D l M a i n 함수를 사용하여 초기화한다는 점에 유의해야 합니다.D l l M a i n 함수가 실행될 때 같은 주소 공간의 다른 D L L은 아직 DL l l M a i n 함수를 실행하지 않았을 수 있습니다.이것은 초기화되지 않았음을 의미하므로 다른 D L L에서 입력한 함수를 호출하는 것을 피해야 합니다.또한 D l l M a i n 내부에서 L o a d L i b r a r y (E x) 및 F r e e L i b r a r y 함수를 호출하지 않아야 합니다. 이 함수들은 의존적인 순환을 형성하기 때문입니다.
DLL_PROCESS_ATTACH 알림 DL L이 프로세스의 주소 공간에 처음 매핑될 때 시스템은 DL L의 DL L M a i n 함수를 호출하여 fd w R e a s o n 의 값인 DL LP R O C E S S _ AT TA C H.이 문제는 D L 파일 이미지가 처음 매핑된 경우에만 발생합니다.루틴이 나중에 프로세스에 매핑된 주소 공간의 D L L에서 L o a d L i b r a r y (E x) 함수를 호출하면 운영 체제는 D L L의 사용 계수만 증가할 뿐 D L LP R O C E S S _ AT TA C H의 값은 D L L의 D l M a i n 함수를 호출합니다.D L L을 처리하는 경우P R O C E S S _ AT TA C H의 경우 D L L은 D L L에서 요구하는 모든 프로세스 관련 초기화를 수행해야 합니다.예를 들어, D L L에는 프로세스의 주소 공간에 생성된 고유한 스택을 사용해야 하는 함수가 포함될 수 있습니다.DLL_PROCESS_DETACH가 DL L이 프로세스의 주소 공간에서 제거되었음을 알리면 시스템은 DL L의 DL L M a i n 함수를 호출하여 fd w R e a s o n의 값인 DL L 을 전달합니다.P R O C E S S _ D E TA C H.D L L이 값을 처리할 때 프로세스와 관련된 모든 지우기 작업을 수행해야 합니다.예를 들어, D L L은 D L L에서 H e a p D e s t r o y 함수를 호출하여 명령취소할 수 있습니다.P R O C E S S _ D E TA C H 공지 중에 생성된 스택입니다.DLL_THREAD_ATTACH 알림 한 프로세스에서 스레드를 만들 때 시스템은 현재 프로세스에 매핑된 주소 공간의 모든 D L 파일 이미지를 보고 각 파일 이미지에 D L L L 를 호출합니다T H R E A D _ AT TA C H 값의 D l M a i n 함수입니다.이것은 모든 D L L에서 각 스레드의 초기화 작업을 수행할 수 있음을 알려줍니다.새로 생성된 스레드는 D L 을 실행하는 모든 D l M a i n 함수의 코드를 담당합니다.모든 D L L이 알림을 처리할 기회가 있을 때만 새 스레드가 스레드 함수를 실행할 수 있습니다.
DLL_THREAD_DETACH 알림에서 스레드를 종료하는 첫 번째 방법은 스레드 함수를 되돌려 주는 것입니다.따라서 시스템은 이 스레드를 제거하기 위해 E x i t h r e a d 를 호출할 수 있습니다.E x i t t h r e a d 함수는 스레드가 실행을 종료하려고 하지만 시스템이 이를 즉시 취소할 수는 없음을 알려줍니다.반대로 취소될 스레드를 제거하고 매핑된 D L L의 모든 DL L L을 호출합니다T H R E A D _ D E TACH 값의 D l M a i n 함수입니다.이 알림은 모든 D L L에서 각 스레드의 제거 작업을 수행합니다.DllMain과 C/C++ 실행 라이브러리는 DL L을 작성할 때, C/C + 실행 라이브러리의 초기 도움말을 받아야 합니다.예를 들어, 만약 당신이 만든 D L L에 전역 변수가 포함되어 있다면, 이 전역 변수는 C++ 클래스의 실례입니다.이 글로벌 변수를 D l l M a i n 함수에서 원활하게 사용하기 전에 이 변수는 구조 함수를 호출해야 합니다.이것은 C/C + 런타임 라이브러리의 D L L 부팅 코드로 이루어집니다.DL L 파일 이미지가 프로세스의 주소 공간에 매핑되면 시스템은 실제로 호출됩니다D l l M a i n C RTS t a r t u p 함수 대신 D l l M a i n 함수를 호출합니다.DLL 로드 지연(그런데 어떻게 지연하나요?^ ^)
Microsoft Visual C++ 6.0은 DL L을 더욱 쉽게 조작할 수 있는 새로운 기능을 제공합니다.이 특성을 지연 로드 D L L이라고 합니다.로드가 지연된 D L L은 링크가 포함된 D L L로 코드가 D L L에 포함된 기호를 참조하려고 할 때까지 기다려야 로드됩니다.로드 지연 DL L은 다음과 같은 경우에 유용합니다.
• 만약 프로그램이 여러 개의 D L L을 사용한다면 초기화 시간이 비교적 길다. 왜냐하면 로드 프로그램은 프로세스의 주소 공간에 필요한 모든 D L L을 비추기 때문이다.이 문제를 해결하는 방법 중 하나는 프로세스가 실행될 때 각각 D L L을 분리해서 불러오는 것이다.로드가 지연된 D L L은 이러한 로드를 쉽게 완료할 수 있습니다.
• 코드에 새 함수를 호출한 다음 이전 버전의 시스템에서 프로그램을 실행하려고 하는데, 이 시스템에 함수가 없으면, 불러오는 프로그램이 오류를 보고하고 프로그램을 실행하지 못하게 합니다.프로그램을 실행할 수 있는 방법이 필요합니다. 그리고 오래된 시스템에서 프로그램이 실행되는 것을 발견하면, 누락된 함수를 호출하지 않습니다.함수 트랜시버
함수 트랜시버는 한 함수에 대한 호출을 다른 D L L의 다른 함수로 전달하는 데 사용되는 D L 출력 섹션의 항목입니다.DLL 마이그레이션 M i c r o s o f t 는 Windows 2000에 D L 마이그레이션 기능을 추가합니다.이 기능은 운영체제의 마운트 프로그램이 먼저 프로그램 디렉터리에서 파일 모듈을 마운트하도록 강제할 수 있습니다.로드 프로그램이 프로그램 디렉터리에서 이 파일을 찾을 수 없을 때만 다른 디렉터리를 검색합니다.프로그램이 항상 프로그램의 디렉터리를 먼저 찾도록 강제로 불러오기 위해서, 프로그램의 디렉터리에 파일을 넣는 작업을 해야 한다.이 파일의 내용은 무시할 수 있지만 파일 이름은 A p p N a m e 여야 합니다.l o c a l.예를 들어, 실행 가능한 파일의 이름이 S u p e r A p 인 경우e x e. 그러면 파일을 Su p e r A p 라고 불러야 합니다.e x e . l o c a l.이 파일이 있는지 확인하기 위해 시스템 내부에서 L o a d i b r y (E x)가 수정되었습니다.만약 응용 프로그램의 디렉터리에 이 파일이 존재한다면, 이 디렉터리의 모듈은 이미 불러옵니다.프로그램 디렉토리에 이 모듈이 없으면 L o a d L i b r a r y (E x)가 정상적으로 실행됩니다.이 특성은 등록된 C O M 객체에 유용합니다.이것은 응용 프로그램으로 하여금 자신의 디렉터리에 C O M 대상 D L L을 넣을 수 있게 한다. 그러면 같은 C O M 대상을 등록한 다른 응용 프로그램은 당신의 조작을 방해할 수 없다.
zz

좋은 웹페이지 즐겨찾기