정적으로 연결된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!