Funktion per String Aufrufen



  • Hallo Leute,

    ich möchte eine Funktion schreiben die einen char* bekommt und daraufhin jene Funktion aufruft die im String per Name steht. Die Namen dieser Funktionen stehen leider erst zur Laufzeit bzw. beim Kunden fest, da sie per dll eingebunden werden. Und welche dlls das seine werden... KA.
    Ich kann also kein if Statement der Form

    If stringX == "calcALL" Then
    calcALL();
    Fi

    machen. Links oder Stichworte die mich der Lösung näher bringen würden schon reichen.

    Malte



  • Wenn die funktionen aus ner Dll kommen kannst doch einfach GetProcAddress verwenden oder seh ich da was falsch



  • Hi,

    die Funktionen müssen alle die gleichen Parameter und den gleichen Rückgabewert haben.
    angenommen die exportieren Dllfunktionen hätten folgendes Muster:

    bool Funktionsname(char* Parameter1, void* Parameter2);
    

    So könnte dann der Code aussehen:

    typedef bool (*DLLFUNCTION)(char* Parameter1, void* Parameter2);
    bool ExecFunctionFromDll(char* Funktionsname, char* Dllname, char* Parameter1=NULL, void* Parameter2=NULL)
    {
       HMODULE hLib = LoadLibrary(Dllname); // dll laden
       if(!hLib) return false; // dll nicht gefunden
       DLLFUNCTION pFn = (DLLFUNCTION) GetProcAddress(hLib, Funktionsname); // Zeiger auf die Funktion bekommen
       if(!pFn) // wenn Funktion nicht gefunden wird
       {
          FreeLibrary(hLib);
          return false;
       }
       pFn(Parameter1, Parameter2); // Funktion aufrufen
       FreeLibrary(hLib);
       return true;
    }
    

    Grüße Rapha



  • Hallo CMatt und Rapha,

    vielen Dank für die Hilfe:-) So geht es....

    Viele Grüße

    Malte



  • Ich bin gerade am Testen und es funktioniert nicht...

    Wie kann ich angeben das die Aufrufkonvention __stdcall sein soll?
    Keines von beiden funktioniert:
    typedef __stdcall bool (*DLLFUNC2)(double P1, double P2, int i);
    typedef bool __stdcall (*DLLFUNC2)(double P1, double P2, int i);



  • Es war:
    typedef bool (__stdcall *DLLFUNC2)(double P1, double P2, int i);


Anmelden zum Antworten