DLL Aufrufe Syntax



  • Habe mal alles in C++ minimiert und probiert. Hier meine DLL die aus der anderen DLL aufgerufen werden soll:

    // DLL die von der anderen Dll aufgerufen wird
    #include "stdafx.h"
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
    
    #define DllExport	extern  "C" __declspec( dllexport )
    #define WINAPI		__stdcall
    
    // Interface
    DllExport int    WINAPI Test	(double&);
    
    // Implementation 
    DllExport int    WINAPI Test	(double& d1)
    {
    	int i = 7;
    	i = (int)d1 + i;
    	return i;
    }
    

    Diese DLL funktioniert definitiv!!
    und hier die aufrufende DLL:

    // Diese Dll ruft die Test-Funktion in der xyz.dll auf
    //***  Test Schnittstelle zur DLL definieren
    typedef int (*Test_t)(double&);
    Test_t Test;
    //*/
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {
    //**************    Dll holen -> Handle hLib
    HMODULE hLib = LoadLibrary("xyz.dll");
    
    //Adresse der Funktion holen
    Test = (Test_t) GetProcAddress (hLib, "Test");
    
        return TRUE;
    }
    
    #define DllExport	extern  "C" __declspec( dllexport )
    #define WINAPI		__stdcall
    
    // Interface
    DllExport int    WINAPI fDllTest	(double&);
    
    // Implementation 
    DllExport int    WINAPI fDllTest(double& d1)
    {
    	int i = 0;
    	// Aufruf der anderen DLL -> Absturz??
    	i=Test(d1);
    	return i;
    
    }
    

    Der Aufruf i=Test(d1) scheint faul zu sein warum?
    Wenn ich die obere DLL ohne Parameter definiere und aufrufe bekomme ich den
    Integer-Rückgabewert korrekt zurück, nur mit Parameter gehts nicht. Was ist hier faul?



  • Probier es mal mit einem double-Pointer statt einer Referenz.



  • ...Und bitte lies die Doku über DllMain, komplexe Dinge wie das Laden einer anderen Dll gehören definitiv nicht in diese Funktion.
    Außerdem wird DllMain mindestens zweimal aufgerufen. Der erste Parameter gibt Aufschluss über den Grund des Aufrufs.



  • _matze schrieb:

    Probier es mal mit einem double-Pointer statt einer Referenz.

    Meinst du so so hier?

    // Aufruf der anderen DLL -> Absturz??
    i=Test(&d1);
    

    geht auch nicht...



  • Falsches Forum.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vielleicht liegt es daran, dass du Test_t hier nicht als __stdcall deklarierst. Wieso definierst du eigentlich WINAPI manuell? Das wird doch durch die windows.h bereits geregelt.

    typedef int (*Test_t)(double&);
    

    Außerdem solltest du unbedingt Prüfungen einbauen, ob LoadLibrary und GetProcAddress erfolgreich waren und wenn nicht, mit GetLastError() zu schauen, was schiefgelaufen ist.



  • das ist ja nun nicht viel Code, es wird doch wohl jemanden geben, der Ahnung hat?!
    UNd mir den Mist zum Spielen bringt.

    hmmm



  • Wenn du nicht auf das eingehst was dir vorgeschlagen wird, wird dir auch keiner helfen können.



  • Was wurde denn vorgeschlagen?



  • Der Namen dem Du GetprocAddress übergibst ist falsch... entweder nimm eine def-Datei oder schau mittels www.dependencywalker.com nach, wie der echte Namen ist...



  • torama1 schrieb:

    Was wurde denn vorgeschlagen?

    Caller schrieb:

    Vielleicht liegt es daran, dass du Test_t hier nicht als __stdcall deklarierst. Wieso definierst du eigentlich WINAPI manuell? Das wird doch durch die windows.h bereits geregelt.

    typedef int (*Test_t)(double&);
    

    Außerdem solltest du unbedingt Prüfungen einbauen, ob LoadLibrary und GetProcAddress erfolgreich waren und wenn nicht, mit GetLastError() zu schauen, was schiefgelaufen ist.

    Wurde dir übrigens auch im zweiten Thread vorgeschlagen, den du in einem anderen Unterforum eröffnet hast.


Anmelden zum Antworten