>백엔드 개발 >C++ >DLL이 응용 프로그램 디렉터리에 없을 때 정적으로 연결된 DLL에 대한 DLL 검색 경로를 변경하는 방법은 무엇입니까?

DLL이 응용 프로그램 디렉터리에 없을 때 정적으로 연결된 DLL에 대한 DLL 검색 경로를 변경하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-03 06:01:30670검색

How to Alter the DLL Search Path for Statically Linked DLLs When the DLL is Not in the Application Directory?

정적으로 연결된 DLL에 대한 DLL 검색 경로 변경

딜레마:

정적으로 링크된 DLL을 DLL을 응용 프로그램에 추가하는 경우 일반적으로 응용 프로그램 디렉터리 내에서 DLL을 검색합니다. 그러나 특정 시나리오에서는 DLL이 동일한 디렉터리 내에 있지 않을 수 있습니다. 예를 들어, "플러그인"용으로 지정된 하위 폴더에 있을 수 있습니다.

가능한 해결 방법:

1. 동적 연결:

플러그인 기능에 액세스하려면 정적 연결 대신 LoadLibrary() 및 GetProcAddress()를 사용하는 것이 좋습니다. 이를 통해 지정된 위치에서 DLL을 로드할 때 유연성이 향상됩니다.

2. 환경 변수 수정:

플러그인 폴더 경로를 시스템의 PATH 환경 변수에 추가하면 DLL을 성공적으로 찾고 로드할 수 있습니다.

3. 지연 로드 메커니즘:

지연 로드 메커니즘을 사용하여 플러그인 기능 로드를 연기합니다. 제공된 경로를 활용하여 DLL을 로드하는 사용자 지정 도우미 기능을 구현합니다.

4. 어셈블리 생성:

플러그인 폴더 내에 .manifest 파일을 생성하여 플러그인 폴더를 어셈블리로 변환합니다. 응용 프로그램 내에서 "플러그인" 폴더를 종속 어셈블리로 지정합니다. 플러그인 폴더 내에서 DLL 검색을 지시합니다.

5. 스텁 애플리케이션 및 동적 로딩:

애플리케이션을 스텁 실행 파일과 동적으로 로드되는 구성 요소로 세분화합니다. 스텁 실행 파일 내에서 SetDllDirectory를 사용하여 플러그인 폴더를 나타냅니다. 그런 다음 "appstub.dll" 파일의 전체 경로를 전달하는 LoadLibrary를 호출합니다.

추가 팁:

폴더를 어셈블리로 전환:

DLL이 포함된 디렉터리를 어셈블리로 변환하려면 "[folder_name].manifest"라는 파일을 다음 내용이 포함된 폴더에 추가하세요.

<assembly manifestVersion="1.0">
  <assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
  <file name="Plugin.dll"/>
</assembly>

Pragma 지시문 DLL 로드의 경우:

Visual Studio 7 이상에서는 다음 pragma 지시문을 사용하여 응용 프로그램이 로컬 디렉터리가 아닌 어셈블리에서 DLL을 검색하도록 지시합니다.

#pragma comment(linker, "/manifestdependency:\"name='Plugins' \
                         processorArchitecture='*' version='1.0.0.0' \
                         type='win32'\"")

위 내용은 DLL이 응용 프로그램 디렉터리에 없을 때 정적으로 연결된 DLL에 대한 DLL 검색 경로를 변경하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.