DLL Funktionsaufruf mit Parametern crashed



  • probier ich morgen mal aus...



  • 👎 (*KOO_TO_STRING)(d1,d2,i1,s1);
    👍 KOO_TO_STRING(d1,d2,i1,s1);

    und bitte:
    KOO_TO_STRING_t KOO_TO_STRING = NULL;
    ...
    if(KOO_TO_STRING) KOO_TO_STRING(d1,d2,i1,s1);

    Nach neuer "Sicherheitspolitik" vom MS wird es zukünftig wohl besser sein DLL's mit LoadLibrary mit vollem Pathname anzugeben. Auf die Windows Suchreihenfolge wenn kein Verzeichnis angegeben ist, wird wohl kein verlass mehr sein.



  • Bist du sicher, dass du im richtigen Forum bist? Ich seh nur C und WinAPI - mit C++ hat dein Quelltext garnichts zu tun. (vor allem die eingebundenen Header nicht)



  • Habe jetzt 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;
    
    }
    

    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?



  • typedef int _stdcall (*Test_t)(double&);



  • matze555 schrieb:

    typedef int _stdcall (*Test_t)(double&);

    das mag der Compiler gar nicht --Syntaxfehler



  • torama1 schrieb:

    matze555 schrieb:

    typedef int _stdcall (*Test_t)(double&);

    das mag der Compiler gar nicht --Syntaxfehler

    die sau ... microschrott? dann versuch
    typedef int (_stdcall *Test_t)(double&);

    da wird aber Dein Problem liegen. Wenn die DLL mit z.B. cdecl als Standard Aufrufkovention compiliert wird, all Deine Funktionen aber manuell _stdcall setzen, dann geht der Compiler bei Deinem Funktionspointer wieder cdecl aus. Beim Aufruf/Rückkehr passt dann nix mehr auf'm Stack.



  • ja was mach ich denn nun? Wie gesagt ohne Parameterliste geht der Hokus-Pokus.
    Es wird doch jemanden geben, der schon mal ne DLL aus einer DLL aufgerufen hat und das auch mit Parameterliste und Strings usw.

    gibts doch gar nicht.



  • // 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;
    
    }
    

    Wenn in Gupta TD ein Parameter als Receive Param angegeben wird, muß im Dll-Interface ein Pointer genommen werden. Also

    DllExport int    WINAPI fDllTest(double* d1)
    

    Ansonsten geht das nur zufällig und kracht spätestens beim Durchreichen an die nächste Funktion.

    Ausserdem glaube ich nicht, das _cdecl-Schnittstellen überhaupt Referenzen kennen, da C sie ja nunmal auch nicht kennt. (Von Fortran mal ganz abgesehen)



  • Alle meine C++ - DLLs benutzen die _cdecl - Deklaration. Das haut auch mit Parametern und Receive Parameter, String usw. super hin bei Einbindung in den TeamDeveloper.

    Hat den jemand mal die 2 Minuten Zeit die 2 Projekte zu cutten und mal selber auszuprobieren. Evtl. ist es ja ganz trivial.
    Oder es liegt wirklich nur am UNICODE den der TD nicht mehr kann. Ich werde mal mit niedriger Version 4.0 oder so noch mal probieren.

    naja danke trotzdem erst mal


Anmelden zum Antworten