2017-10-26 2 views
2

명시 적으로 라이브러리를로드하는 명확한 방법을 찾고 있습니다. 대부분 LIB와 DLL 쌍을 가지고있어서 LIB가 모든 "load stuff"를 처리하고 dll에서 직접 함수를 호출 할 수 있습니다. 명시 적으로이 일을 할 때, 나는 다음의 정렬을 수행해야합니다명시 적으로 라이브러리를로드하는 명확한 방법

HMODULE libA = LoadLibrary("dllA.dll"); // NULL if load failed 
HMODULE libB = LoadLibrary("dllB.dll"); // NULL if load failed 

void (*functionA)(void) = libA ? GetProcAddress(libA,"functionA"):NULL; 
void (*functionB)(void) = libB ? GetProcAddress(libB,"functionB"):NULL; 

그것은 지저분한 것입니다 경우에서 LoadLibrary() 내가 DLL에서 함수를 호출 할 때 GetProcAddress를()가 모두 내 코드에 걸쳐 발견된다. 나는 내가 1-2 개의 파일 내에서 모든 처리를 작성하고 LIB와 DLL 쌍을 통해 암시 적으로 라이브러리를로드하는 것처럼 함수를 호출 할 수있는 깨끗한 방법이 있는지 알고 싶습니다.

+2

한 번에 한 곳에서 'LoadLibrary'를 호출하고 GetProcAddress를 여러 번 호출하여 모든 함수 포인터를 얻고이를 사용할 수 있습니다. 당신은 또한이 DLL에 대한 지연로드를 구현할 수 있습니다 – RbMm

+2

이것은 프로그래밍 101입니다. 당신을 위해이 기능을 마무리하고 세부 사항으로부터 당신을 보호하는 함수 또는 클래스를 생성하십시오. –

+0

일부 추상화를 제공하는 [Boost.DLL] (http://www.boost.org/doc/libs/release/doc/html/boost_dll.html)을 살펴볼 수도 있습니다. 아직 사용하지는 않았지만 [예제] (http://www.boost.org/doc/libs/release/doc/html/boost_dll/tutorial.html#boost_dll.tutorial.plugin_basics)는 매우 깨끗해 보입니다. – zett42

답변

2

실제로 라이브러리의로드 및 심볼 검색 실패를 정상적으로 처리 할 수있는 동안 모든 암시 적 링크 편의성을 얻을 수있는 방법이 있습니다. Visual Studio는 사용자 코드에 로더에 연결할 수있는 기능을 제공하고 사용할 수없는 기호에 대해 임의의 복구 전략을 구현하는 Linker Support for Delay-Loaded DLLs을 제공합니다 (예 : no-op 스텁 반환). 따라서 모든 장애 처리를 단일 장소로 통합 할 수 있습니다.

+0

현재 지연로드도 사용 중입니다. 내 목표는 더 많은 플랫폼 독립적 인 옵션을 사용하는 것입니다. 로드 라이브러리와 GetProcAddress는 플랫폼에 따라 다르다는 것을 알고 있습니다. 따라서이 모든 "로드 물건"을 처리하기 위해 별도의 모듈이 필요하므로 모듈을 쉽게 수정할 수 있습니다. –

+2

@RonaldKu : 모듈 로딩은 기본적으로 플랫폼에 따라 다릅니다. 그러나 플랫폼 독립적 인터페이스를 제공 할 수 있습니다. 사용할 수없는 심볼에 대해서는'nullptr'을 반환합니다. 또는'std :: optional'을 사용하고 [value_or] (http://en.cppreference.com/w/cpp/utility/optional/value_or)를 no-op 스텁 포인터와 함께 사용하십시오. 시간이 허락 할 때 개념을 설명하기 위해 몇 가지 샘플 코드를 고안 할 수 있는지 알아 보겠습니다. – IInspectable

0

필요한 외부 기능에 대한 순수한 인터페이스를 작성하십시오. (플랫폼에 따라 다름)

(플랫폼에 따라) 구현 클래스를 제공하십시오. 귀하의 Windows 구현에 DLL을로드 초기 절차 주소를 가져옵니다.

인터페이스 함수를 호출해야 할 때보 다 클래스가 호출을로드 된 DLL로 라우팅합니다.

다른 플랫폼에도 같은 방법을 사용하십시오.

이것은 지연로드 된 DLL을 사용하는 것입니다. 그것은 단지 수동 솔루션입니다. 그러나 인터페이스를 사용하는 접근 방식은 실제 플랫폼에 의존하는 솔루션을 제공합니다.