VC++ loadlibrary () 가 삼자 dll를 불러오는 데 실패했습니다. 오류 코드를 되돌려줍니다: 126의 해결 방법

1694 단어

방법 1: LoadLibraryEx


DLL이 호출자의 동일한 디렉토리에 없으면 LoadLibrary(L "DLL 절대 경로")로 로드할 수 있습니다.그러나 호출된 DLL 내부에서 다른 DLL이 호출되면 호출이 실패합니다.해결 방법은 LoadLibraryEx:LoadLibraryEx("DLL 절대 경로", NULL, LOAD WITH ALTERED SEARCH PATH)를 사용합니다.LOAD 지정을 통해WITH_ALTERED_SEARCH_PATH - 시스템 DLL 검색 순서를 DLL이 있는 디렉토리에서 시작합니다.

방법 2: SetCurrentDir


디렉터리에 걸쳐 dll를 호출합니다. 이렇게 해야 합니다.
  • 현재 작업 디렉토리를 GetCurrentDir로 저장
  • SetCurrentDir로 현재 작업 디렉터리를 DLL이 있는 경로로 설정하려면 절대 경로를 사용해야 합니다
  • LoadLibrary로 당신의 DLL
  • SetCurrentDir를 사용하여 원래 작업 경로로 복원
  • 아래와 같다
    
    TCHAR chCurDir[MAX_PATH] = {0}; 
    GetCurrentDirectory(MAX_PATH, chCurDir); 
    SetCurrentDirectory(_T("E:\\test\\")); 
    m_hDLL = LoadLibrary(_T("MyTest.dll")); 
    SetCurrentDirectory(chCurDir); 

    dll 로드 순서
  • EXE가 있는 디렉토리;
  • 현재 디렉토리 GetCurrentDirectory();
  • 시스템 디렉토리 GetSystemDirectory(),
  • WINDOWS 디렉토리GetWindowsDirectory(),
  • 환경 변수 PATH에 포함된 디렉토리입니다.

  • loadlibrary를 사용하여 dll에서 사용하는 경로를 불러올 때, 이 함수는 이 경로를 무시하고, 정해진 규칙에 따라 dll만 불러옵니다.따라서 지정한 디렉터리의 dll를 불러오려면 상기 두 가지 해결 방안을 사용할 수 있습니다.

    후속


    최근에 또 126의 문제에 부딪혔는데, 상술한 두 가지 방식을 채택해도 여전히 해결할 수 없다
    문제 설명:
    Windows 64비트 시스템, 32비트 dll 로드, DLL 로드 경로는 "C:\Windows\System32\xxx.dll"해결 방법: 위에서 로드에 실패한 DLL을 "C:\Windows\SysWOW64"아래로 복사합니다.프로그램은 변경할 필요가 없습니다. 경로 매개 변수는 여전히 "C:\Windows\System32\xx.dll"을 기입합니다.문제 해결!
    이유:
    간단하게 말하면 SysWOW64의 전체 명칭에서 원인을 찾을 수 있다. 32bit Windows On 64bit Windows(64비트 Windows의 32비트 Windows)
    자세한 내용은 다음 링크를 참조하십시오.
    SysWow64 소개
    LoadLibraryW() failing to load DLL in System32

    좋은 웹페이지 즐겨찾기