LoadLibrary/GetProcAddress



  • Ich habe hier einen eigentlich ziemlich simplen Code. Mit LoadLibrary() lade ich eine externe DLL, mit dem zurückgegebenen (gültigen) Handle und GetProcAddress() hole ich mir Pointer auf die enthaltenen C-Funktionsexports.

    Das funktioniert bei einer DLL ganz problemlos, bei einer anderen DLL und dem identischen Code kommt statt der Funktionspointer NULL zurück.

    Was ich bereits überprüft habe:
    - es existieren von der DLL keine Abhängigkeiten zu anderen DLLs (mit Dependency Walker gecheckt - und dann würde ja auch schon das LoadLibrary() fehlschlagen und nicht erst GetProcAddress())
    - der Funktionsname ist definitv richtig geschrieben und die Funktion wird auch so exportiert (mit Dependency Walker gecheckt)
    - GetLastError() liefert 127 zurück (Funktion nicht gefunden), was mir auch nicht wirklich weiterhilft

    Hat jemand noch irgendwelche Ideen, was da möglicherweise noch schieflaufen könnte?

    Danke!



  • Wenn der Funktionsname genau dem Namen aus dem Depenency-Walker entspricht, dann muss es gehen.

    Kann es sein, dass vielleicht schon eine andere Datei mit genau dem gleichen Namen geladen ist? Gibst Du den Vollständigen Pfad zur DLL an, oder nur den Namen der DLL? Geb mal den vollständigen Pfad an, dann wird auf jeden Fall die korrekte DLL geladen.



  • Stichwort: Name mangling

    Dependency Walker kann Namen unmanglen, hast du auch wirklich den richtigen kopiert?



  • dot schrieb:

    Dependency Walker kann Namen unmanglen, hast du auch wirklich den richtigen kopiert?

    Dieses "undecorating" macht er aber nur bei C++-Funktionen? Meine DLL exportiert reine C-Funktionen...



  • Und wie exportierst du diese Funktionen genau, verwendest du eine .def Datei oder wie hast du das Mangling genau abgeschaltet?



  • Ich exportiere die Funktionen gar nicht, die DLL kommt von einem Dritthersteller, von dem ich weiß, dass er C-Funktionen exportiert (ist so spezifiziert und Dependency Walker zeigt mir auch gena udas an).



  • Und du hast dabei auch bedacht, dass C-Funktionen unter Windows je nach Calling Convention üblicherweise mit einem _ davor oder anderen Namenszusätzen exportiert werden?


Anmelden zum Antworten