DLL laden klappt nicht immer?



  • Hallo.

    Ich will mal nur so aus Test eine DLL laden. Ich habe mir mal paar aus Windows wahllos rauskopiert.

    Nutze VisualC++ 6 und DLL's liegen im Ordner mit der EXE.

    // keine "OK" Ausgabe
    HINSTANCE DllInstance = NULL;
    DllInstance = LoadLibrary("MMSYSTEM.DLL");
    if (DllInstance) puts("OK");
    
    // Ausgabe "OK", funktioniert somit
    HINSTANCE DllInstance = NULL;
    DllInstance = LoadLibrary("aaaamon.dll");
    if (DllInstance) puts("OK");
    

    Kann mir jemand sagen warum?



  • Ich würd gern über GetLastError() mir den Fehlercode ausgeben lassen, aber ich erhalte ja nur einen Wert. Wie gebe ich den dazugehörigen Fehlertext aus? Wäre nett wenn wer helfen könnte 🤡



  • Heinzel schrieb:

    Ich will mal nur so aus Test eine DLL laden. Ich habe mir mal paar aus Windows wahllos rauskopiert.

    So einfach lassen sich zunächst nicht alle DLL's laden. Es liegt zum einen daran, das eine DLL wiederum andere benötigt, die beim Laden automatisch mitgeladen werden müssen. Und wenn man wahllos mal eine DLL woandershin kopiert, dann kann das u.U. daneben gehen, da diese zusätzlichen DLL's nicht gefunden werden.

    Nun habe ich festgestellt, dass der Depency Walker die MMSYSTEM.DLL nicht laden mag, mit dem Vermerk:

    "No PE Signature found. This is not a valid Win32 module."

    Was das genau bedautet, dem bin ich nicht auf den Grund gegangen, aber es liegt wohl in der DLL. Vielleicht ist dieese DLL gar keine DLL, sondern ein COM Objekt. Auch diese können die Erweiterung DLL haben (macht z.B. Visual Basic, mit Visual C wäre es in der Regel eine OCX). Und die lassen sich so nicht unbedingt laden.

    Gruss, Gio



  • Stimmt!

    Aber weiss vielleicht wer warum

    DWORD dw = GetLastError();
    char sBuffer[100];
    FormatMessage(
    	FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    	0,
    	dw,
    	MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    	sBuffer,
    	strlen(sBuffer),
    	NULL);
    Ausgabe(sBuffer);
    

    nur leeren String beinhaltet? Würde trotzdem für Zukunft gern wissen was genau schief lief. Vielleicht hätte das mir der Fehler ja gesagt nur kann ich mit 193 als ErrorCode garnichts anfangen.



  • das MSDN (Oct 2001) sagt unter dem Index "error codes (Win32)"

    193 | %1 is not a valid Win32 application. | ERROR_BAD_EXE_FORMAT

    Vielleicht gibt es keinen Fehlereintrag im System. Wäre bei Bill nicht das erste mal 😃

    Ansonsten probier mal folgendes:

    LPVOID lpMsgBuf;
    
      FormatMessage( 
          FORMAT_MESSAGE_ALLOCATE_BUFFER | 
          FORMAT_MESSAGE_FROM_SYSTEM | 
          FORMAT_MESSAGE_IGNORE_INSERTS,
          NULL,
          GetLastError(),
          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
          (LPTSTR) &lpMsgBuf,
          0,
          NULL 
      );
      // Display the string.
      ::MessageBox( theApp.m_hMainFrame , (LPCTSTR)lpMsgBuf, "NT Control - System Error", MB_OK | MB_ICONINFORMATION );
      // Free the buffer.
      LocalFree( lpMsgBuf );
    

    Aber mehr, als "not a valid Win32 application" wird trotzdem nicht bei rauskommen.

    Gruss, Gio


Anmelden zum Antworten