DLL 로드 지연의 의미
앞말
Microsoft Visual C++ 6.0은 DLL을 보다 쉽게 조작할 수 있는 새로운 기능을 제공합니다.이 기능을 DLL 로드 지연 이라고 합니다.로드가 지연된 DLL은 링크가 포함된 DLL로 코드가 DLL에 포함된 기호를 참조하려고 할 때까지 기다려야 로드됩니다.로드 지연 DLL은 다음과 같은 경우에 유용합니다.
(1) 만약 응용 프로그램이 몇 개의 DLL을 사용한다면, 초기화 시간이 비교적 길다. 왜냐하면 로더가 필요한 모든 DLL을 프로세스의 주소 공간에 비추기 때문이다.이 문제를 해결하는 방법 중 하나는 프로세스가 실행될 때 DLL을 분리해서 불러오는 것입니다.로드가 지연된 DLL은 이러한 로드를 더욱 쉽게 수행할 수 있습니다.
(2) 코드에 있는 새로운 함수를 호출한 다음 이전 버전의 시스템에서 프로그램을 실행하려고 하는데 이 시스템에 이 함수가 없으면 로드 프로그램이 오류를 보고하고 프로그램을 실행하지 못하게 합니다.프로그램을 실행할 수 있는 방법이 필요합니다. 그리고 오래된 시스템에서 프로그램이 실행되는 것을 발견하면, 누락된 함수를 호출하지 않습니다.
예를 들어 한 응용 프로그램이 Windows 2000에서 실행될 때 PSAPI 함수를 사용하고, Windows 98에서 실행될 때 ToolHelp 함수 (예를 들어 Process32Next) 를 사용합니다. 이 응용 프로그램이 초기화될 때 GetVersionEx 함수를 호출해서 메인 운영체제를 확인하고 해당하는 다른 함수를 정확하게 호출합니다.Windows 98에서 어플리케이션을 실행하려고 하면 로드 프로그램에 PSAPI가 없는 오류 메시지가 표시됩니다.dll 모듈.마찬가지로 로드 지연 DLL은 이 문제를 쉽게 해결할 수 있습니다.
2.
다음은 DLL 로드 지연이 실행될 수 있도록 하는 비교적 쉬운 작업부터 살펴보겠습니다.
1、우선 평소처럼 DLL을 만듭니다.평상시처럼 실행 가능한 모듈을 만들어야 하지만, 두 개의 링크 프로그램 스위치를 수정하고 실행 가능한 모듈을 다시 연결해야 한다.다음은 두 개의 링크 프로그램 스위치입니다.
/Lib:DelayImp.lib
/DelayLoad:Mydll.dll
Lib 스위치는 링크 프로그램에 실행 가능한 모듈에 특수한 함수인 delayLoadHelper를 끼워 넣는 것을 알려 줍니다.
두 번째 스위치는 링크 프로그램에 다음 사항을 알려줍니다.
(1) 실행 가능한 모듈의 입력 섹션에서 MyDll을 제거합니다.dll, 이렇게 하면 프로세스가 초기화될 때 운영체제의 마운트 프로그램이 DLL을 현저하게 불러오지 않습니다.
(2) 실행 가능한 모듈에 새 Delay Import(입력 지연) 섹션(.didata라고 함)을 삽입하여 MyDll에서 어떤 함수가 실행되고 있는지 표시합니다.dll의 입력입니다.
(3) --delayLoadHelper 함수로 호출을 이동하여 지연 로드 함수로 변환합니다.응용 프로그램이 실행될 때 로드 지연 함수에 대한 호출은 실제로 --delay LoadHelper 함수에 대한 호출입니다.이 함수는 특수한 Delay Import 절을 참조하고 LoadLibrary를 호출한 후에 GetProcAddress를 호출하는 것을 알고 있습니다.로드 지연 함수의 주소를 얻으면 - delayLoadHelper는 이 함수에 대한 호출을 준비해야 합니다. 그러면 장래의 호출은 로드 지연 함수에 대한 호출로 바로 바뀔 것입니다.동일한 DLL에서 다른 함수를 처음 호출할 때는 이러한 함수를 스케줄링해야 합니다.또한/delayLoad 링크 프로그램의 스위치를 여러 번 설정할 수 있으며, 불러오는 DLL마다 스위치를 한 번씩 설정할 수 있습니다.
2. 자, 전체 조작 과정은 이렇게 간단하다.하지만 다른 두 가지 문제도 고려해야 한다.
(1) 일반적으로 운영 체제의 로더가 실행 가능한 모듈을 로드할 때 필요한 DLL을 로드합니다.DLL을 로드하지 못하면 로드 프로그램에서 오류 메시지가 표시됩니다.로드가 지연된 DLL인 경우 초기화할 때 DLL에 저장되었는지 확인하지 않습니다.로드 지연 함수를 호출할 때 DLL을 찾을 수 없는 경우 -- delayLoadHelper 함수는 소프트웨어 예외 조건을 발생시킵니다.구조화된 예외 처리(SEH) 방법을 사용하여 예외 조건을 추적할 수 있습니다.이 이상 조건을 추적하지 않으면 프로세스가 종료됩니다.
(2) - delayLoadHelper가 확실히 당신의 DLL을 찾았지만 호출할 함수가 이 DLL에 없을 때 또 다른 문제가 발생할 수 있습니다.예를 들어 로드 프로그램이 오래된 DLL 버전을 찾으면 이런 상황이 발생한다.이런 상황에서 delayLoadHelper도 소프트웨어 이상 조건을 일으키는데 이 소프트웨어 이상 조건에 대한 처리 방법은 위와 같다.
다음 절에서 소개한 예시 프로그램은 이러한 오류를 처리하기 위해 SEH 코드를 정확하게 작성하는 방법을 보여 준다.코드에 SEH와 오류 처리와 아무런 관계가 없는 많은 다른 요소들이 있음을 발견할 수 있을 것이다.그러나 이러한 요소는 로드 지연 DLL을 사용할 때 사용할 수 있는 액세스 가능성과 관련이 있습니다.다음은 이러한 특성을 소개할 것이다.만약 더 많은 고급 기능을 사용하지 않는다면, 이 추가 코드를 삭제할 수 있습니다.
보시다시피 Visual C++ 개발팀은 VcppException(EROR SEVERITY ERRROR, ERRROR MOD NOT FOUND)과 VcppException(EROR SEVERITY ERRROR, EROR PROC NOT FOUND) 두 개의 소프트웨어 이상 조건 코드를 정의했습니다.이 코드는 DLL 모듈을 찾을 수 없음과 함수를 찾을 수 없음을 나타내는 데 각각 사용됩니다.
셋째,
지금까지 로드 지연 DLL을 사용하는 방법과 오류 조건을 올바르게 해결하는 기본 방법에 대해 설명했습니다.그러나 Microsoft의 DLL 로드 지연 실현 코드는 지금까지 설명한 내용을 초과합니다.
예를 들어, 프로그램이 지연된 DLL을 마운트 해제할 수 있습니다.
만약 응용 프로그램이 문서를 인쇄하기 위해 특수한 DLL을 필요로 한다면, 이 DLL은 대부분의 시간을 사용하지 않기 때문에, 마운트 지연된 DLL로 매우 적합하다.단, 만약 사용자가 Print 명령을 선택했다면, 이 DLL의 함수를 호출해서 자동으로 DLL을 불러올 수 있습니다.이것은 확실히 좋지만, 문서를 인쇄한 후에 사용자는 다른 문서를 바로 인쇄하지 않을 수도 있기 때문에 이 DLL을 마운트 해제하고 시스템의 자원을 방출할 수 있습니다.사용자가 다른 문서를 인쇄하기로 결정한 경우 DLL은 사용자의 요청에 따라 다시 로드할 수 있으며, 로드 지연 DLL을 제거하려면 다음 두 가지 작업을 수행해야 합니다.
(1) 우선 실행 가능한 파일을 만들 때 다른 링크 프로그램 스위치 (/delay: unload) 를 설정해야 합니다.
(2) 다음으로, 소스 코드를 수정하고 DLL을 마운트 해제할 때 --FunloadDelayLoaded DLL 함수를 호출해야 합니다.
/delay: unload 링크 프로그램 스위치는 링크 프로그램이 다른 절을 파일에 넣는다는 것을 알려 줍니다.이 섹션은 호출된 함수를 지울 때 필요한 정보를 포함하고 있습니다. 그러면 다시 호출할 수 있습니다. - delayLoadHelper 함수입니다.
--FunloadDelayLoaded DLL을 호출할 때, 마운트 지연된 DLL의 이름을 전달합니다.이 함수는 파일의 마운트 해제되지 않은 섹션에 들어가서 DLL의 모든 함수 주소를 지우고 --FunloadDelayLoaded DLL에서 FreeLibrary를 호출하여 DLLL을 마운트 해제합니다.
다음은 몇 가지 중요한 문제를 지적하고자 한다.
첫째, DLL을 마운트 해제하기 위해 FreeLibrary를 직접 호출하지 마십시오. 그렇지 않으면 함수의 주소가 지워지지 않습니다. 그러면 다음에 DLL의 함수를 호출하려고 시도할 때 접근 위반이 발생할 수 있습니다.
둘째, -FunloadDelayLoaded DLL을 호출할 때 전달하는 DLL 이름은 경로를 포함하지 않아야 합니다. 이름의 자모는/DelayLoad 링크 프로그램의 스위치에 전달할 때 사용하는 자모의 대소문자와 같아야 합니다. 그렇지 않으면 -FUnloadDelayLoaded DLL의 호출이 실패합니다.
셋째, 지연된 DLL을 영원히 마운트 해제하지 않으려면/delay: unload 링크 프로그램 스위치를 설정하지 마십시오. 실행 가능한 파일의 길이가 비교적 작을 것입니다.
넷째,/delay:unload 스위치로 만든 모듈에서 -FunloadDelayLoaded DLL을 호출하지 않으면 아무 일도 일어나지 않습니다.
FunloadDelayLoaded DLL은 아무 작업도 수행하지 않으며 FALSE로 돌아갑니다.
로드가 지연되는 DLL의 또 다른 기능은 기본 설정에 따라 호출된 함수가 일부 메모리 주소와 연결될 수 있다는 것이다. 이 메모리 주소에서 시스템은 함수가 하나의 프로세스의 주소에 있을 것이라고 여긴다.링크 가능한 지연 로드를 만드는 DLL 섹션은 실행 가능한 파일을 비교적 크게 만들 수 있기 때문에 링크 프로그램도/Delay: nobind 스위치를 지원합니다.사람들은 일반적으로 링크를 하는 것을 좋아하기 때문에 대부분의 응용 프로그램은 이 링크 스위치를 사용해서는 안 된다.
로드 지연 DLL의 마지막 특징은 Microsoft의 진정한 관심을 보여주는 고급 사용자를 위한 것입니다.
소재--delayLoadHelper 함수가 실행될 때 제공된 연결 함수를 호출할 수 있습니다.함수가 수신됩니다. -
delayLoadHelper 함수의 진행률 및 오류 알림입니다.또한 이러한 함수는 DLL을 로드하는 방법과 함수의 가상 메모리 주소를 가져오는 방법을 다시 로드할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.