Microsoft MVP성태의 닷넷 이야기
VC++: 11. Delay Loaded DLL [링크 복사], [링크+제목 복사],
조회: 25322
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 


DLL을 과연 언제 delay loaded 방식으로 처리하는 것이 좋을까요?

첫 번째 이유는, 당연히 최초 Application의 로딩 속도를 빠르게 하고 싶어서입니다. 이건 너무나 당연한 것이라서 더 이상 설명의 여지가 없지요.

두 번째 이유는, 다중 환경을 지원하기 위해서 delay loaded 방식을 사용할 수 있습니다. 음... 다중 환경이라... 예를 한번 들어볼까요?

TestMethod라는 Win32 API가 Windows XP 이상에만 포함된 Test.DLL 파일에만 구현되어 있다고 해봅시다. 그런 경우, Test.lib에 링크를 해버리면 해당 프로그램은 Windows 98에서는 실행조차 할 수가 없게 되지요. 만약 개발자가, Win98에서는 해당 기능을 사용하려고 할 때에 불가능하다는 메시지를 띄우게 하고, WinXP 이상인 경우에는 정상적으로 사용하도록 프로그램하고 싶다면!

바로 그럴 때, delay loaded 방식으로 Test.DLL과 링크를 시켜주면 됩니다. 다음과 같은 식이면 좋겠지요.

if (IsWin98() == true)
{
  MessageBox(NULL, "WinXP 이상에서만 사용할 수 있습니다.", NULL, MB_OK);
} else {
   TestMethod();
}

물론, GetProceAddress / LoadLibrary를 사용한 방법도 있는데, 그런 경우에는 호출이 delay loaded DLL 방식보다 더 복잡하게 되지요. 소스의 간결성 차원에서라도 바람직한 방법은 아닙니다.

자, 이제 그럼 어떻게 Delay Loaded 방식으로 링크할 수 있을까요?
경우의 수는 여러 가지가 있겠지만, 제가 주로 사용하는 틀은 다음과 같습니다.

VS.NET 2005의 경우.

: 소스
#pragma comment( lib, "Test.lib" )

: 프로젝트 속성
좌측 트리에서 Configuration Properties / Linker / Input을 선택하면 우측 리스트 박스에 Delay Loaded DLLs 항목이 나옵니다. 거기에 "Test.dll"이라고 추가해 주면 됩니다.

그리 어렵지 않지요. ^^ 사실, delay loaded 방식에 대해서 소개된 지는 오래되었지만. 이제서야 한번 실제 적용을 해보게 되는군요. ^^

이외에도 다음의 토픽을 함께 봐두시는 것도 좋을 것 같아서 링크를 적어봅니다.

Explicitly Unloading a Delay-Loaded DLL :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vcconexplicitlyunloadingdelay-loadeddll.asp

Loading All Imports for a Delay-Loaded DLL:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vclrfLoadingAllImportsForDelayLoadedDLL.asp

Changes in the DLL Delayed Loading Helper Function Since Visual C++ 6.0 :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/vchowChangesInHelperFunctionFromVisualC60.asp











[최초 등록일: ]
[최종 수정일: 6/26/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 121  122  123  124  125  126  127  128  129  130  131  132  [133]  134  135  ...
NoWriterDateCnt.TitleFile(s)
1763정성태9/30/201425186.NET Framework: 468. PDB 파일을 연동해 소스 코드 라인 정보를 알아내는 방법파일 다운로드1
1762정성태9/30/201426024.NET Framework: 467. 닷넷에서 EIP/RIP 레지스터 값을 구하는 방법 [1]파일 다운로드1
1761정성태9/29/201423129.NET Framework: 466. 윈도우 운영체제의 보안 그룹 이름 및 설명 문자열을 바꾸는 방법파일 다운로드1
1760정성태9/28/201421131.NET Framework: 465. ICorProfilerInfo::GetILToNativeMapping 메서드가 0x80131358을 반환하는 경우
1759정성태9/27/201432476개발 환경 구성: 240. Visual C++ / x64 환경에서 inline-assembly를 매크로 어셈블리로 대체하는 방법파일 다운로드1
1758정성태9/23/201439066개발 환경 구성: 239. 원격 데스크톱 접속(RDP)을 기존의 콘솔 모드처럼 사용하는 방법 [1]
1757정성태9/23/201419670오류 유형: 242. Lync로 모임 참여 시 소리만 들리지 않는 경우 - 두 번째 이야기
1756정성태9/23/201428802기타: 48. NVidia 제품의 과다한 디스크 사용 [2]
1755정성태9/22/201435630오류 유형: 241. Unity Web Player를 설치해도 여전히 설치하라는 화면이 나오는 경우 [4]
1754정성태9/22/201425946VC++: 80. 내 컴퓨터에서 C++ AMP 코드가 실행이 될까요? [1]
1753정성태9/22/201421752오류 유형: 240. Lync로 세미나 참여 시 소리만 들리지 않는 경우 [1]
1752정성태9/21/201441915Windows: 100. 윈도우 8 - RDP 연결을 이용해 VNC처럼 사용자 로그온 화면을 공유하는 방법 [5]
1751정성태9/20/201440038.NET Framework: 464. 프로세스 간 통신 시 소켓 필요 없이 간단하게 Pipe를 열어 통신하는 방법 [1]파일 다운로드1
1750정성태9/20/201425280.NET Framework: 463. PInvoke 호출을 이용한 비동기 파일 작업파일 다운로드1
1749정성태9/20/201425023.NET Framework: 462. 커널 객체를 위한 null DACL 생성 방법파일 다운로드1
1748정성태9/19/201426564개발 환경 구성: 238. [Synergy] 여러 컴퓨터에서 키보드, 마우스 공유
1747정성태9/19/201429805오류 유형: 239. psexec 실행 오류 - The system cannot find the file specified.
1746정성태9/18/201426759.NET Framework: 461. .NET EXE 파일을 닷넷 프레임워크 버전에 상관없이 실행할 수 있을까요? - 두 번째 이야기 [6]파일 다운로드1
1745정성태9/17/201424309개발 환경 구성: 237. 리눅스 Integration Services 버전 업그레이드 하는 방법 [1]
1744정성태9/17/201432217.NET Framework: 460. GetTickCount / GetTickCount64와 0x7FFE0000 주솟값 [4]파일 다운로드1
1743정성태9/16/201422040오류 유형: 238. 설치 오류 - Failed to get size of pseudo bundle
1742정성태8/27/201428374개발 환경 구성: 236. Hyper-V에 설치한 리눅스 VM의 VHD 크기 늘리는 방법 [2]
1741정성태8/26/201422472.NET Framework: 459. GetModuleHandleEx로 알아보는 .NET 메서드의 DLL 모듈 관계파일 다운로드1
1740정성태8/25/201433852.NET Framework: 458. 닷넷 GC가 순환 참조를 해제할 수 있을까요? [2]파일 다운로드1
1739정성태8/24/201427689.NET Framework: 457. 교착상태(Dead-lock) 해결 방법 - Lock Leveling [2]파일 다운로드1
1738정성태8/23/201423384.NET Framework: 456. C# - CAS를 이용한 Lock 래퍼 클래스파일 다운로드1
... 121  122  123  124  125  126  127  128  129  130  131  132  [133]  134  135  ...