Dynamisches DLL Handling
-
Hallo zusammen,
ich habe eine Anwendung die EXCEL-Files ausliest.
In diesen Daten sind Abläufe abgebildet, die der Nutzer starten und auswerten kann. Für jede neue Funktionalität muss momentan die EXE aktualisiert werden.In der Excel-Datei werden die Befehle wie Funktionen eingetragen:
Bespiel: RELAY_EIN(8,3) oder Summe(var1, var3) usw.
Nun würde ich gerne die Funktionen in DLLs auslagern um nicht immer die EXE-Files neu zu erstellen. Somit würde ich in den Listen vermerken in welchen DLLs die Funktionen zu finden sind:Beispiel RELAY_EIN(8,3) DDL: RELAYSTEUERUNG.dll
Im Grunde könnte man einfach mit dem Funktionsnamen in der DLL suchen, und den Zeiger verwenden. Nun die Frage: Wie kann ich die DLLs handeln wenn ich vorher nicht weiß, welche Parameter ich vorbereiten muss.
Beispiel: Heute haben alle DLL-Funktionen maximal 4 Parameter. Morgen 5.
Kann man das Typedef "dynamisch gestalten?Beispielcode:
AnsiString FunktionStarten(AnsiString DLLName, AnsiString FunktionsName, AnsiString Parameter) { typedef int(__stdcall *pFunc)(int); //(??????????) pFunc DLLFUNCTION; int antwort = 0; HINSTANCE h = LoadLibrary(DLLName.c_str()); if(h) { DLLFUNCTION = (pFunc)GetProcAddress(h,FunktionsName.c_str()); if(DLLFUNCTION) antwort = DLLFUNCTION(????????); else {} ShowMessage("Funktion nv"); } }
Kennt jemand von Euch eine Möglichkeit?
-
Hallo,
Du mußt schon wissen welche Parameter deine Funktion hat. Sonst kannst du sie nicht verwenden.
Du kannst dir aber typedefs von allen möglichen Parameterlisten anfertigen. Dann bräuchtest du noch eine Funktion in der dll mit fester Parameterliste welche dir die nötigen Informationen liefert.
-
Da hast Du sicher recht.
Nur weiß ich jetzt noch nicht was da noch alles kommen wird. Und ich möchte nicht immer wieder den Code ändern müssen.
Gibt es nicht bei C++ eine Möglichkeit aus Test bzw einem String zur Laufzeit Code zu erzeugen?
-
Hallo
Nein C++ ist eine reine Compiletime Sprache. Es gibt zur Laufzeit keine Datentypen und damit auch keine Interpretiermöglichkeit.
Du must dein DLL-Interface schon von Anfang an so konstruieren das alle nötige Flexibilität vorhanden ist. Das erfordert meistens mehr als nur eine einfache Funktion. Ich glaube du solltest dir mal die üblichen Plugin-Implementaionen anschauen, die in C++ meistens mittels Polymorphie umgesetzt werden. Um die DLLs nicht statisch linken zu müßen hat die konkrete DLL im C-Interface meistens nur eine Factory-Function, die die Plugin-Instanz erstellt./Edit : wenn es nur um eine variable Anzahl an Parametern, aber immer mit gleichen Typ, geht dann reicht eventuell ja auch nur ein dynamsiches Array ansteller fester Parameter?
bis bald
akari
-
Dann könnte ich eine vielzahl von Variant Typen verwenden.
Kann es sein das Optionale Parameter vom Typ Variant nicht möglich sind? Jedenfalls habe ich immer wieder einen Zugriffsfehler bekommen?!?