Absturtz nach Funktionzeiger call



  • Hallo,

    ich lade eine DLL mit der Funktion LoadLibrary. Doch wenn ich eine Funktion nun aufrufen will mit GetProcAddres, so bekomme ich eine Fehlermeldund und mein Programm stürtzt ab.

    Komischerweiße rufe ich die selbe .DLL in einer CRT Klassenbibilothek genau so auf, aber dort bekomme ich keine Fehlermeldung;

    Woran kann das liegen dass troz erfolgreich geladener Library der Funktionsaufruf daneben geht? (GetProcAdress gibt schon einen richtigen wert zurück);

    Gruß Stu;



  • Gleiche Dll's ?



  • Was für eine Fehlermeldung kommt denn genau?

    (und eventuell wäre es eine gute Idee, mal mit GetLastError() etc zu überprüfen, ob jeder Schritt bis hierhin erfolgreich war)

    PS: Möglicherweise stimmt ja die Signatur des Funktionszeigers nicht mit der Deklaration der Funktion überein.



  • Mit GetLastError hab ich schon alles Durchgeprüft, kommt immer 0, also alles ok.

    Und als Meldung kommt:

    #Run-Time Check Failer #0 - The value of ESP was not properly saved across a funktion call.

    Das ist die Meldung im Debug-Modus.

    Wenn ich dsa Programm im Release-modus rennen lasse, geht er in die DLL rein, macht aber nach ein paar aufruden nen reboot.

    Die Dll´s sind definitive die selben.



  • DiscoStu1234 schrieb:

    #Run-Time Check Failer #0 - The value of ESP was not properly saved across a funktion call.

    Das sieht schwer nach einer Meinungsverschiedenheit über die Aufrufkonvention oder die Parameterübergabe aus. Wie ist die Funktion denn in der DLL definiert? Und wie genau rufst du sie in deinem Programm auf?



  • //DLL funktion
    extern "C" short NETXML_API ReadData(short , long , short , short  , short);
    
    //aufrufende funktion
    typedef short	(READDATAPROC)(short, long*, short , short*, short);
    
    short WRAPPER::ReadData(short sChannel, long* lpData , short sPoints, short *sRemaining, short sInst)
    	{
    		READDATAPROC * pReadDataProc = (READDATAPROC*)::GetProcAddress(m_hADPCIDLL, "ReadData");
    		return (*pReadDataProc)(sChannel, lpData, sPoints, sRemaining, sInst) ;
    	}
    


  • Erstens: Ist das ein Tippfehler oder unterscheidet sich der vorletzte Parameter dort? (in der DLL ein short, beim Aufruf ein short*)

    Ansonsten bin ich mir nicht sicher, ob das "extern "C"" nicht Probleme mit der Aufrufkonvention geben könnte (d.h. die Art und Weise, wie die Funktion ihre Parameter auswerten will).



  • ja ist ist nen tippfehler...

    das ist aber komisch dass es bei dieser CRT-Klassenbibelothek funtikioniert...

    und wenn ich die DLL debugge, dann stimmen die Parameter auch, d.h sie haben die richtigen Wert, welchen ich übergeben habe.



  • Hast du vllt Multithread- und Single-Thread-Bibliotheken vermischt (also bei deinem Testprogramm, das die DLL lädt und beim compilieren der DLL selbst) ?



  • ja daran könnte es liegen, ich werds mal testen.


Anmelden zum Antworten