fehlende Abhängigkeiten von LoadLibrary mit FormatMessage ermitteln



  • Hiho,

    ich lade eine DLl zur Laufzeit mit LoadLibrary. Wenn eine weitere Abhängigkeit dieser DLL nicht vorhanden ist, bekomme ich entsprechend kein gültiges Handle zurück. So weit so normal. ich möchte nun gerne eine aussagekräftige Fehlermeldung, welche Abhängigkeit genau fehlt.
    Bisher nutze ich GetLastError und FormatMessage

    //!
    using ErrorType = std::pair<DWORD, std::basic_string<TCHAR>>;
    
    //see https://msdn.microsoft.com/de-de/library/windows/desktop/ms680582(v=vs.85).aspx
    inline ErrorType getLastWindowsError()
    {
    	//
    	constexpr DWORD strSize = 2048;
    
    	//at first get the error code
    	ErrorType result; 
    	result.first = GetLastError();
    	result.second.resize(strSize);
    
    	//now retrieve a formatted text message from windows
    	auto count = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
    							   FORMAT_MESSAGE_IGNORE_INSERTS,
    							   nullptr, result.first, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    							   &result.second[0],
    							   strSize, nullptr);
    
    	result.second.resize(count);
    
    	return result;
    }
    

    Als Ergebnis kommt da jedoch nur, dass das Modul nicht geladen werden konnte. Ist es irgendwie möglich, an den genauen Modulnamen zu kommen? Also wenn ich z. B. X.dll lade, und diese von Y.dll abhängt, dass er dann sagt, "konnte Y.dll nicht finden".

    VG



  • Hast du denn explizit SetErrorMode aufgerufen, um die Standard-Fehlermeldung zu unterdrücken?
    Leider gibt es wohl keine direkte Möglichkeit programmtechnisch an den Namen des fehlenden Moduls zu kommen, s.a. How to get the missing DLL name after when GetLastError() returns ERROR_MOD_NOT_FOUND.



  • Pellaeon schrieb:

    Als Ergebnis kommt da jedoch nur, dass das Modul nicht geladen werden konnte. Ist es irgendwie möglich, an den genauen Modulnamen zu kommen? [...]

    LoadLibrary() liefert nicht mehr als das. Man könnte zu Fuß den Import table der entsprechenden DLL durchgehen und vor LoadLibrary() selbst versuchen, die Abhängigkeiten zu finden und ggf. eine genaue Fehlermeldung produzieren.

    https://blogs.msdn.microsoft.com/oldnewthing/20131127-00/?p=2553
    https://github.com/glampert/portable-pedump (leider nur x86)



  • Th69 schrieb:

    Hast du denn explizit SetErrorMode aufgerufen, um die Standard-Fehlermeldung zu unterdrücken?

    Habe ich nicht. Ich hatte zum Testen SetErrorMode(0) vor dem Aufruf probiert, das hat aber nix geändert.

    Swordfish schrieb:

    Pellaeon schrieb:

    Als Ergebnis kommt da jedoch nur, dass das Modul nicht geladen werden konnte. Ist es irgendwie möglich, an den genauen Modulnamen zu kommen? [...]

    LoadLibrary() liefert nicht mehr als das. Man könnte zu Fuß den Import table der entsprechenden DLL durchgehen und vor LoadLibrary() selbst versuchen, die Abhängigkeiten zu finden und ggf. eine genaue Fehlermeldung produzieren.

    https://blogs.msdn.microsoft.com/oldnewthing/20131127-00/?p=2553
    https://github.com/glampert/portable-pedump (leider nur x86)

    Danke für die Info.

    VG

    Pellaeon


Anmelden zum Antworten