원본 : http://www.debuglab.com/knowledge/delayload.html
1.요약
Dll을 프로그램이 시작할 때 로드하는 것이 아니라, Dll을 처음으로 사용할 때 로드하도록 하는 방법을 알아봅니다.
2.본문
Visual C++ 6.0 Linker는 Delay Load 를 지원합니다.
기능은 요약에서 말씀드린 것과 같습니다.
[ 어떻게 사용하나? ]
사용법은 다음과 같습니다. Visual Studio 6.0 IDE가 따로 지원하는 UI는 없으므로 Project Settings > Link > Project Options 에디트 창에 이렇게 적습니다.
[ Delay Load는 언제 사용하나? ]
사용자가 프로그램을 더블클릭하고 나서 프로그램이 로드될때까지의 시간을 줄이는 것이 Delay Load의 가장 큰 역할이겠죠.
평소에는 잘 사용되지 안고 특별한 경우에만 사용되는 dll들을 찾으면 되겠죠..
[ 특별한 Dll은 어떻게 찾나? ]
함께올린 DelayLoadProfile 이라는 유틸을 사용해서 어플리케이션을 실행시키면 load된 dll과 해당 dll을 몇 번 사용했나.. 하는 통계가 나옵니다.
어플리케이션을 실행 시켰다가 그냥 끈 경우에, 한 번도 사용하지 않는 dll들은 Delay Load를 적용시킬 아주 좋은 후보가 되겠죠..
이 유틸리티를 제작한 Matt Pietrek 아저씨의 말에 따르면
SHELL32.DLL
WINSPOOL.DRV
OLE32.DLL
OLEAUT32.DLL
등이 유력한 후보라고 하네요..
[ 구현원리는 무엇인가? ]
오늘 함께 올린 팁을 보시면 import library를 통해서 로드되는 dll은 IAT(Import Address Table)에 실제 함수의 주소를 매핑시킨다고 나와있습니다.
DelayLoad가 적용되는 경우에는 실제 함수의 주소가 매핑되는 것이 아니라 스텁 코드가 매핑되는 것이죠..
스텁 코드가 하는 일은, 처음으로 함수 호출이 되었을 때, 실제 dll을 LoadLibrary를 통해서 로드하는 겁니다. 물론 다음 번 호출부터는 이미 실제 함수가 매핑되어 있으므로 같은 과정을 거칠 필요가 없겠죠..
사용법에서 DelayImp.lib를 함께 링크해야한다고 말씀드렸습니다. 사실 스텁 코드는 delayimp.lib 에 있는 루틴을 호출하도록 되어있는 작은 코드일 뿐입니다.
3.예제
예제의 압축을 풀어보시면
DelayLoadProfile.exe
DelayLoadProfileDll.dll
이 들어있습니다.
DelayLoadProfile은 콘솔 프로그램이기때문에, 프로파일링 하고자하는 exe의 이름을 첫번째 인자로 주어서 실행시키시면 됩니다.
다음은 제가 ActiveTutor 3.0 을 프로파일링 한 결과 입니다.
c:\>DelayLoadProfile ATRecorder
DelayLoadProfile: 2Mathia.dll was called 0 times
DelayLoadProfile: 2EqnV.dll was called 0 times
DelayLoadProfile: SHLWAPI.dll was called 19 times
DelayLoadProfile: LTWVC11n.dll was called 6 times
DelayLoadProfile: MSVCRT.dll was called 219 times
DelayLoadProfile: USER32.dll was called 29650 times
DelayLoadProfile: GDI32.dll was called 8634 times
DelayLoadProfile: ADVAPI32.dll was called 28 times
DelayLoadProfile: SHELL32.dll was called 2 times
DelayLoadProfile: COMCTL32.dll was called 50 times
DelayLoadProfile: ole32.dll was called 2 times
DelayLoadProfile: OLEPRO32.DLL was called 0 times
DelayLoadProfile: OLEAUT32.dll was called 0 times
DelayLoadProfile: FC4CD.dll was called 4 times
DelayLoadProfile: WINMM.dll was called 12 times
DelayLoadProfile: MSACM32.dll was called 0 times
DelayLoadProfile: zlib.dll was called 0 times
DelayLoadProfile: BugslayerUtil.dll was called 0 times
AT 3.0을 실행시켰다가 아무것도 하지않고 바로 종료한 경우의 결과입니다.
AT 3.0 은 실행하는데 오래걸리는 덩치 큰 프로그램이 아니어서, 굳이 최적화할 필요는 없는 것 같습니다.
하지만 몇몇 dll 들은 한 번도 사용되지 않은 걸 알 수 있습니다.
해당 dll들에 delayload를 적용시킨다면 적으나마 효과를 볼 수 있겠죠.
4.참고
Under the HOOD, Matt Pietrek, Feb 2000 MSJ
- 2001.08.19 Smile Seo -
1.요약
Dll을 프로그램이 시작할 때 로드하는 것이 아니라, Dll을 처음으로 사용할 때 로드하도록 하는 방법을 알아봅니다.
2.본문
Visual C++ 6.0 Linker는 Delay Load 를 지원합니다.
기능은 요약에서 말씀드린 것과 같습니다.
[ 어떻게 사용하나? ]
사용법은 다음과 같습니다. Visual Studio 6.0 IDE가 따로 지원하는 UI는 없으므로 Project Settings > Link > Project Options 에디트 창에 이렇게 적습니다.
/DELAYLOAD:dllname.dll그리고 DelayImp.lib 를 함께 링크해야합니다.(이유는 뒤에서 설명)
[ Delay Load는 언제 사용하나? ]
사용자가 프로그램을 더블클릭하고 나서 프로그램이 로드될때까지의 시간을 줄이는 것이 Delay Load의 가장 큰 역할이겠죠.
평소에는 잘 사용되지 안고 특별한 경우에만 사용되는 dll들을 찾으면 되겠죠..
[ 특별한 Dll은 어떻게 찾나? ]
함께올린 DelayLoadProfile 이라는 유틸을 사용해서 어플리케이션을 실행시키면 load된 dll과 해당 dll을 몇 번 사용했나.. 하는 통계가 나옵니다.
어플리케이션을 실행 시켰다가 그냥 끈 경우에, 한 번도 사용하지 않는 dll들은 Delay Load를 적용시킬 아주 좋은 후보가 되겠죠..
이 유틸리티를 제작한 Matt Pietrek 아저씨의 말에 따르면
SHELL32.DLL
WINSPOOL.DRV
OLE32.DLL
OLEAUT32.DLL
등이 유력한 후보라고 하네요..
[ 구현원리는 무엇인가? ]
오늘 함께 올린 팁을 보시면 import library를 통해서 로드되는 dll은 IAT(Import Address Table)에 실제 함수의 주소를 매핑시킨다고 나와있습니다.
DelayLoad가 적용되는 경우에는 실제 함수의 주소가 매핑되는 것이 아니라 스텁 코드가 매핑되는 것이죠..
스텁 코드가 하는 일은, 처음으로 함수 호출이 되었을 때, 실제 dll을 LoadLibrary를 통해서 로드하는 겁니다. 물론 다음 번 호출부터는 이미 실제 함수가 매핑되어 있으므로 같은 과정을 거칠 필요가 없겠죠..
사용법에서 DelayImp.lib를 함께 링크해야한다고 말씀드렸습니다. 사실 스텁 코드는 delayimp.lib 에 있는 루틴을 호출하도록 되어있는 작은 코드일 뿐입니다.
3.예제
예제의 압축을 풀어보시면
DelayLoadProfile.exe
DelayLoadProfileDll.dll
이 들어있습니다.
DelayLoadProfile은 콘솔 프로그램이기때문에, 프로파일링 하고자하는 exe의 이름을 첫번째 인자로 주어서 실행시키시면 됩니다.
다음은 제가 ActiveTutor 3.0 을 프로파일링 한 결과 입니다.
c:\>DelayLoadProfile ATRecorder
DelayLoadProfile: 2Mathia.dll was called 0 times
DelayLoadProfile: 2EqnV.dll was called 0 times
DelayLoadProfile: SHLWAPI.dll was called 19 times
DelayLoadProfile: LTWVC11n.dll was called 6 times
DelayLoadProfile: MSVCRT.dll was called 219 times
DelayLoadProfile: USER32.dll was called 29650 times
DelayLoadProfile: GDI32.dll was called 8634 times
DelayLoadProfile: ADVAPI32.dll was called 28 times
DelayLoadProfile: SHELL32.dll was called 2 times
DelayLoadProfile: COMCTL32.dll was called 50 times
DelayLoadProfile: ole32.dll was called 2 times
DelayLoadProfile: OLEPRO32.DLL was called 0 times
DelayLoadProfile: OLEAUT32.dll was called 0 times
DelayLoadProfile: FC4CD.dll was called 4 times
DelayLoadProfile: WINMM.dll was called 12 times
DelayLoadProfile: MSACM32.dll was called 0 times
DelayLoadProfile: zlib.dll was called 0 times
DelayLoadProfile: BugslayerUtil.dll was called 0 times
AT 3.0을 실행시켰다가 아무것도 하지않고 바로 종료한 경우의 결과입니다.
AT 3.0 은 실행하는데 오래걸리는 덩치 큰 프로그램이 아니어서, 굳이 최적화할 필요는 없는 것 같습니다.
하지만 몇몇 dll 들은 한 번도 사용되지 않은 걸 알 수 있습니다.
해당 dll들에 delayload를 적용시킨다면 적으나마 효과를 볼 수 있겠죠.
4.참고
Under the HOOD, Matt Pietrek, Feb 2000 MSJ
- 2001.08.19 Smile Seo -
"MFC" 카테고리의 다른 글
- WaitCursor가 만들어지지 않는 경우 (0)2007/03/22
- Dll Rebase 시키기 (0)2007/03/21
- Delayload 적용시키기 (0)2007/03/21
- MFC 라이브러리에 동적으로 링크된 정규 DLL (0)2007/03/21
- 대용량의 파일 순식간에 읽기 (0)2007/03/21
Tags Delayload

수안이의 컴퓨터 연구실
DelayLoadProfile.zip



Leave your greetings.