2009-09-07 3 views
6

필자는 도움이 절실히 필요하므로 Visual Studio에서 응용 프로그램 종속성을 관리해야합니다. 응용 프로그램은 Windows 7의 특정 버전에서만 DLL에 연결되며 다른 환경에서는 DLL이로드되어서는 안됩니다. DLL 지연로드를 사용하여 어떻게 달성 할 수 있습니까?이 주제는 완전히 새로운 것이므로이 특별한 문제에 대해 온라인에서 좋은 참고 자료가 없습니다.지연 로딩 DLL

감사

+1

지연로드가 어떻게 작동하는지 또는 어떻게 적용 할 수 있습니까? – xtofl

답변

8

프로젝트는 DLL이는 링커/입력/지연로드 된 DLL이 필드에 지정하여, 필요한 경우 만로드해야에 따라 달라 지정할 수 있습니다. 이 설정은 다른 빌드 구성에 따라 다를 수 있습니다.

+0

답장을 보내 주신 분은 Thx를 사용하실 수 있습니다. 해당되는 경우 예제 또는 코드 스 니펫을 제공 할 수 있습니다. –

+4

지연로드 시점입니다. 코드 일이 아니며 설정 사항입니다. – xtofl

+0

말씨가 틀린 것처럼 보입니다. "DLL이 지연로드 용량과 연결되어 있어야합니다."라고 말하면 해당 DLL의 구성 요소 인 .obj에서 해당 DLL을 만드는 것입니다./DELAY 플래그는 _imported_ 모듈이 아닌 _importing_ 모듈을 실제로 적용합니다. 또한이 지원없이 빌드 된 Windows 2000 DLL을 지연로드 할 수있는 이유이기도합니다. – MSalters

1

지연로드를 사용하는 대신 dynamicloadingLoadLibraryGetProcAddress을 사용하셨습니까? 이것은 사용하기가 더 쉽습니다.

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

PGNSI pGNSI; 
SYSTEM_INFO si; 

ZeroMemory(&si, sizeof(SYSTEM_INFO)); 

pGNSI = (PGNSI) GetProcAddress(
    GetModuleHandle(TEXT("kernel32.dll")), 
    "GetNativeSystemInfo"); 
if(NULL != pGNSI) 
    pGNSI(&si); 
else GetSystemInfo(&si); 
+9

링커에서 자동으로 생성 할 수있는 코드를 작성하는 것이 더 간단합니까? – xtofl

+2

당신이 전화하고 싶은 기능이 1 개 밖에 없다면 그게 좋겠지 만 ... 그렇지 않으면 평범하지 않은 나쁜 선택입니다. – Goz

+3

-1 - 링커에서의 지연로드 지원은 특히 LoadLibrary() 및 GetProcAddress()를 처리하지 못하도록하는 것을 목표로합니다! – Bids

10

MSDN에는 꽤 좋은 설명이 있습니다. here.

기본적으로 지연로드 섹션에 문제의 DLL이 설정되어 있습니다. DLL에있는 함수를 호출 할 때까지 해당 DLL을로드하지 않습니다. 상기 링크에서

는 :

비주얼 C++의 링커는 현재의 DLL 지연 로딩을 지원한다. 이 은 DLL 지연로드를 구현하기 위해 Windows SDK 함수 LoadLibrary 및 GetProcAddress를 사용할 필요가 없습니다.

Visual C++ 6.0 이전에는 런타임에 DLL을로드하는 유일한 방법은 LoadLibrary 및 GetProcAddress를 사용하여 입니다. DLL을 사용하는 실행 파일이나 DLL이로드 될 때 운영 체제에서 DLL을 으로로드합니다.

Visual C++ 6.0부터 DLL과 정적으로 링크 할 때 링커는 프로그램에서 함수가 해당 DLL의 함수를 호출 할 때까지 DLL을 지연시키는 옵션을 제공합니다.

응용 프로그램에서 도우미 함수 (Visual C++에서 제공하는 기본 구현 )와 함께 /DELAYLOAD (Delay Load Import) 링커 옵션을 사용하여 DLL로드를 지연시킬 수 있습니다. 도우미 함수는 LoadLibrary 및 GetProcAddress를 호출하여 런타임에 시간에 DLL을로드합니다.

당신의 프로그램이 DLL에있는 함수를 호출 할 수 있습니다 경우

당신은 DLL을 로딩 지연을 고려해야합니다.

DLL의 함수는 프로그램의 실행이 늦을 때까지 호출되지 않을 수 있습니다.

지연된 DLL로드는 빌드 중 .EXE 또는 .DLL 프로젝트에서 지정할 수 있습니다. 하나 이상의 DLL 로딩을 지연시키는 .DLL 프로젝트 은 Dllmain에서 지연로드 진입 점 을 호출해서는 안됩니다.