본문 바로가기

운동하는 개발자/c++

DLL 명시적 링크 LoadLibrary failed 지정된 모듈을 찾을 수 없습니다 (GetLastError : error code 126)

728x90

c++을 이용해서 명시적링크로 DLL파일을 LoadLibrary 로 읽어오는 작업을 했다

HINSTANCE hDLL;     // Handle to DLL

hDLL = LoadLibrary("MyDLL");

핸들 인스턴스를 만들고 LoadLibaray를 호출 할 때
다른 폴더에 있는 DLL파일의 절대경로를 읽어와서  파라미터로 넣어주었는데 핸들은 계속 nullptr이였고

DWORD error_code;

error_code = GetLastError();​

위와 같이 GetLastError 를 호출 해 봤더니 126의 에러코드를 발생하고있었다 126은 모듈을 찾을 수 없다는 내용인데
해당 DLL파일의 절대경로는 윈도우 탐색기로부터 파일을 선택해서 넣은 값인데 이게 잘못될 수 없는데...?
다른 DLL을 읽어보니 정상적으로 Load가 되었다 

그래서 찾아보았더니 "DLL이 또 다른 DLL을 로드 할 시 그 DLL들은 경로를 SYSTEM경로로 잡아주던가 해야한다"!!

예를들어 내가 만든 PROC.DLL이란게 있는데 여기 내부에서 OPENSSL.DLL을 사용중이라고 하자

그럼 A.EXE에서는 절대경로로 LOADLIBRARY를 이용해서 PROC.DLL을 읽어왔지만 정작 PROC.DLL에서 호출하게되는 OPENSSL.DLL은 EXE가 찾을 수 없다는것이다

따라서 해결책으로 가장 쉬운방법은 EXE와 같은경로에 PROC.DLL가 참고하는 DLL들을 싹다 넣어주거나 아님 WINDOWS\SysWow64에 넣어주거나 하는 방법등으로 기본 DLL로드 경로에 해당 파일들을 넣어주는것이다

본인의 경우 A.EXE와 같은경로에 참고하는 DLL을 모두 넣어주어서 해결하였다

별거아닌거로 이거도 몇시간 썼네....


 

728x90