Microsoft MVP성태의 닷넷 이야기
VC++: 11. Delay Loaded DLL [링크 복사], [링크+제목 복사],
조회: 25398
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 91  92  93  94  95  96  [97]  98  99  100  101  102  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11543정성태6/9/201823358.NET Framework: 764. C# 7.2 - private protected 접근자 추가파일 다운로드1
11542정성태6/9/201861874개발 환경 구성: 381. Azure Web App 확장 예제 - Remove Custom Headers
11541정성태6/9/201821049개발 환경 구성: 380. Azure Web App 확장 배포 방법 [1]
11540정성태6/9/201821233개발 환경 구성: 379. Azure Web App 확장 예제 제작 [2]
11539정성태6/8/201821687.NET Framework: 763. .NET Core 2.1 - Tiered Compilation 도입파일 다운로드1
11538정성태6/8/201820489.NET Framework: 762. .NET Core 2.1 - 확장 도구(Tools) 관리 [1]
11537정성태6/8/201825594.NET Framework: 761. C# - SmtpClient로 SMTP + SSL/TLS 서버를 이용하는 방법 [5]
11536정성태6/7/201822436.NET Framework: 760. Microsoft Build 2018 - The future of C# 동영상 내용 정리 [1]파일 다운로드1
11535정성태6/7/201825073.NET Framework: 759. C# - System.Span<T> 성능 [1]
11534정성태6/6/201830524.NET Framework: 758. C# 7.2 - Span<T> [6]
11533정성태6/5/201833249.NET Framework: 757. 포인터 형 매개 변수를 갖는 C++ DLL의 함수를 C#에서 호출하는 방법파일 다운로드1
11532정성태6/5/201822599.NET Framework: 756. JSON의 escape sequence 문자 처리 방식
11531정성태6/4/201826840오류 유형: 468. JSON.parse가 허용하지 않는 문자 [9]
11530정성태5/31/201827609.NET Framework: 755. C# 7.2 - 스택에만 생성할 수 있는 값 타입 지원 - "ref struct" [2]파일 다운로드1
11529정성태5/23/201824872.NET Framework: 754. 닷넷의 관리 포인터(Managed Pointer)와 System.TypedReference [6]파일 다운로드1
11528정성태5/17/201824360.NET Framework: 753. C# 7.2 - 3항 연산자에 ref 지원(conditional ref operator) [1]
11527정성태5/17/201822067오류 유형: 467. RDP 로그인 에러 - This could be due to CredSSP encryption oracle remediation.
11526정성태5/16/201821984.NET Framework: 752. C# 7.2 - 메서드의 반환값 및 로컬 변수에 ref readonly 기능 추가파일 다운로드1
11525정성태5/16/201826091.NET Framework: 751. C# 7.2 - 메서드의 매개 변수에 in 변경자 추가 [3]파일 다운로드1
11524정성태5/15/201825004.NET Framework: 750. C# 7.2 - readonly 구조체 [5]파일 다운로드1
11523정성태5/15/201822168.NET Framework: 749. C# - 값 형식의 readonly 인스턴스에 대한 메서드 호출 시 defensive copy 발생 [1]파일 다운로드1
11522정성태5/15/201820633개발 환경 구성: 378. Azure - VM 진단 설정 화면의 "This subscription is not registered with the Microsoft.Insights resource provider."
11521정성태5/15/201818904개발 환경 구성: 377. Azure - 원하는 성능 데이터로 모니터링 대시보드 구성
11520정성태5/12/201821107.NET Framework: 748. C# 7.1 - 참조 어셈블리(Ref Assemblies)
11519정성태5/12/201822913개발 환경 구성: 376. ASP.NET Web Application 프로젝트의 FileSystem 배포(Publish) 시 Before/After Task 설정 방법 [1]
11518정성태5/10/201821211.NET Framework: 747. C# 7.0에서도 부분적으로 가능해진 "타입 추론을 통한 튜플의 변수명 자동 지정"
... 91  92  93  94  95  96  [97]  98  99  100  101  102  103  104  105  ...