DLL에서 종속 dll 동적 로드
3468 단어 dll
이곳의 상대 경로는 주exe가 있는 경로를 가리키며 상대 경로는 프로그램 실행 과정에서 변화가 발생할 수 있습니다.
그래서 여기에 구덩이가 하나 있다.
1. 일반적인 x.dll에 대해서는 일반적으로 x.exe와 같은 디렉터리에 있고 x.exe는 직접 LoadLibrary x.dll로 하면 된다.
2, 일반적인 x.dll에 의존하는 xdep.dll, 보통 두 dll도 x.exe와 같은 디렉터리에 있고 x.dll은 직접 LoadLibrary xdep.dll도 가능합니다.
3, COM의 x.dll에 대해 직접 LoadLibrary를 하면 안 됩니다. 왜냐하면 x.dll는 등록이 필요하기 때문입니다. x.dl과 xcomdep.dll의 경로가 반드시 x.exe와 같은 디렉터리에 있는 것은 아닙니다. 이렇게 x.dll에서 LoadLibrary xcomdep를 사용합니다.dll는 실패할 것입니다. x.dll에서 얻은 상대 경로는 x.exe의 상대 경로이고 x.exe 경로 아래에는 xcomdep가 없습니다.dll.
이 문제에 대해서는 다음과 같은 몇 가지 함수로 해결할 수 있다.
// dll
HMODULE GetCurrentDllModule()
{
MEMORY_BASIC_INFORMATION m = {0};
VirtualQuery(GetCurrentDllModule, &m, sizeof(MEMORY_BASIC_INFORMATION));
return (HMODULE) m.AllocationBase;
}
// dll
// : e:\test\test.dll
void GetCurrentDllPath(WCHAR* lpwDllPath)
{
HMODULE hThisMod = GetCurrentDllModule();
GetModuleFileNameW(hThisMod,lpwDllPath,MAX_PATH);
}
// dll
// : e:\test\
void GetCurrentDllRoute(WCHAR* lpwDllRoute)
{
GetCurrentDllPath(lpwDllRoute);
WCHAR* lpwPos = wcsrchr(lpwDllRoute,L'\\');
*(lpwPos+1) = L'\0';
}
// dll dll
// : dll test_dep.dll
// :e:\test\test_dep.dll
void GetDepdenceDllPath(const WCHAR* lpcwDepDllName,WCHAR* lpwDepDllPath)
{
GetCurrentDllRoute(lpwDepDllPath);
wcscat(lpwDepDllPath,lpcwDepDllName);
}
// dll dll
HMODULE LoadDepDll(const WCHAR* lpcwDepDllName)
{
WCHAR lpwDepDllPath[MAX_PATH];
GetDepdenceDllPath(lpcwDepDllName,lpwDepDllPath);
return ::LoadLibraryW(lpwDepDllPath);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.