2013-09-25 2 views
0

내 프로그램에서 libcurl.dll을 사용해야합니다. (바이너리는 내 프로그램의 libcurl.dll이 "A.exe"임), libcurl.dll은 zlib1.dll, libeay32.dll에 의존합니다 , ssleay32.dll. 하지만 이미 A.exe 폴더에있는 다른 버전의 libeay32.dll이 있습니다. 그래서 "CURL"폴더를 만들고 이번에 소개 한 새로운 4 DLL을 넣고 동적 DLL로드를 사용하여 libcurl.dll을 호출 할 계획입니다.windows C++ DLL 동적로드

=====================

 
Main folder 

| 

A.exe, 

libeay32.dll(old one), 

Folder "CURL" ----- 

        | 
        | 
       libcurl.dll, zlib1.dll, libeay32.dll, ssleay32.dll 

===================== 

질문은 어떻게 폴더 "CURL"에 DLL을로드 할 수 내 프로그램을 제어 할 수 있다는 것입니다 . "A.exe"가 호출하여 CURL \ libcurl.dll을로드 할 수 있습니다.

HMODULE hModule = LoadLibrary (_ Curl \ libcurl.dll)); 그러나 어떻게 zlib1.dll, libeay32.dll, ssleay32.dll의 경로를 제어 할 수 있습니까? Windows는 기본적으로 A.exe 로컬 폴더에서 DLL을 검색하는 것으로 보입니다.

+0

높은 버전의 OS에서 작동 할 수있는 솔루션을 찾았습니다. 다음을 사용하여 DLL을로드하십시오. LoadLibraryEx ("FullPathofA.exe", NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_DEFAULT_DIRS); 낮은 버전의 OS에서 작동하는 방법이 있습니까? Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008 :이 값을 사용하려면 KB2533623이 설치되어 있어야합니다. Windows Server 2003 및 Windows XP :이 값은 지원되지 않습니다. – Leon

+0

이 구성표가 작동한다고 생각하지 않습니다 :'libeay32.dll'이 이미로드되어 있으므로 버전이 다를지라도 다시로드되지 않습니다! – MSalters

+0

@MSalters 그러나 내가 libcurl.dll을로드하기 전에 적절한 버전의 libeay32.dll을로드하면 어떻게 될까요? – SamuelVimes

답변

0

컴파일러의 include 디렉토리 설정을 사용하십시오. 및/또는 Windows 논리를 사용하여 종속 DLL을 찾을 수 있습니다. (filemon 또는 process monitor으로 도구를 사용하여 어떤 디렉토리가 조회되는지 확인할 수 있습니다)

Windows의 검색 경로를 사용하십시오. 주문 :

  1. 현재 프로세스의 실행 모듈이있는 디렉토리입니다.

  2. 현재 디렉토리.

  3. Windows 시스템 디렉토리. GetSystemDirectory 함수는이 디렉터리의 경로를 검색합니다.

  4. Windows 디렉토리. GetWindowsDirectory 함수는이 디렉터리의 경로를 검색합니다.

  5. PATH 환경 변수에 나열된 디렉토리.

+0

내 질문을 오해 한 것 같아. Windows에서 DLL을 검색하는 순서를 알아. "CURL"폴더를 검색 목록에 추가하고 DLL에 대한 첫 번째 폴더 창 검색을 수행하려고합니다. – Leon

+0

죄송합니다, 어떤 OS/IDE/컴파일러를 사용하십니까? – lordkain

0

당신은 당신이 DLL 대신에 통화 상대 하나의 전체 경로를 지정하면 LoadLibrary으로로드 할 수 있어야합니다. 파일 이름이나 상대 경로 만 사용하는 경우 검색 순서는 lordKain에서 설명한대로입니다 (예 : SetDllDirectory을 호출하여 변경하지 않는 한). 그러나 전체 경로를 사용할 때는 지정된 위치에서만 검색해야합니다. 이 방법으로 처음에는 원하는 libeay32.dll 버전을로드 할 수 있습니다. 그러면 libcurl.dll을로드 할 때 원하는 libeay32.dll 버전이 이미로드됩니다. 또한 dll 리디렉션 매니페스트가 없도록주의하십시오.