mehrer Instanzen desselben Prog´s mit unterschiedlichen DLL´s



  • Problemstellung
    Ein Programm soll unter Windows NT mehrfach gestartet werden.
    Jede Instanz soll eine andere DLL nutzen, diese unterschiedlichen
    DLL´s sollen die gleichen Funktionsnamen und Interface haben.
    Die Dll´s sollen implizit geladen werden.

    Geht das?

    Hintergrund wir testen Geräte, diese unterscheiden sich nicht parametrisierbar von einander, sollen aber im Testprogramm die "gleichen" Testschritte (C/C++ Routinen) erfahren. Diese Testschritte wollte ich in eine Dll pro Prüflingstyp auslagern. Und je nachdem welcher Prüfling kommt, die entsprechende Dll implizit laden, damit die Funktionsnamen (Testschrittnamen) erhalten bleiben.
    Das Testprogramm würde dann immer dieselben Testchritte ablaufen.
    Ein weiterer Vorteil wäre, wenn ein neuer Proflingstyp hinzukommt wäre nur eine neue Dll fällig.

    😞 Ich habe den leisen Verdacht das es nicht geht, wäre aber sehr froh wenn mir einer das Gegenteil beweist. 😉



  • Naturlich geht das.

    sieh dir mal

    LoadLibrary
    GetProcAddress
    FreeLibrary

    an.

    beim progamstart mus du nur abfragen welche dll benutzt werden soll.



  • Eventuell ist auch COM eine Option. Über die Kategorien kannst Du dann sogar noch feststellen, welche Dlls das Interface zur Verfügung stellen.



  • 🙂 Erstmal Danke an euch beide

    😃 @Xqgene
    Du hast leider eine Zeile überlesen.

    Die Dll´s sollen implizit geladen werden.

    Das Verfahren was du vorschlägst ist das explizite laden.
    Diesen zusätzlichen Programmieraufwand würde ich gerne vermeiden.

    😕 @King
    Kann mit deiner Antwort mangels Wissen zu wenig anfangen, Sei bitte so nett und werd etwas ausführlicher



  • was für ein Aufwand???

    beim COM hast du dann wirklich aufwand.

    aber auch anders:

    1. alle dll's heissen gleich z.b. xyz.dll.
    2. deine exe lädt immer xyz.dll
    3. jede 'instanz' deiner exe liegt in einem eigenem verzeichnis.
    4. in dem verzeichnis liegt entsprechende xyz.dll
    5. beim programmstart wird immer zuerst versucht die dll zuladen, die im progammpfad liegt (s.a. LoadLibrary).



  • Der Aufwand zum dynamischen laden einer DLL ist nicht sehr groß.
    Jedenfalls lohnt sich in deinem Fall dieser kl. Aufwand.
    Dann braucht man nur eine INI machen aus der je nach Gerät der DLL-Name geladen wird.
    Jede DLL bekommt dann einen eindeutigen Namen



  • @Xgene
    Insteressante Idee aber
    was macht das System wenn die erste Instanz des Programmes im Speicher ist und läuft und dann das Programm zum zweiten mal gestartet wird.
    Wird dann die geladene DLL oder die DLL im Verzeichnis benutzt?

    Das mehrfach in der Problembeschreibung heißt die Programme sind gleichtzeitig im Speicher und laufen.

    @Unix-Tom
    prinzipiell hast du recht. Ich muss aber davon ausgehen das ich mehrere solche DLL-Gruppen haben werden, jede so mit 30 bis 50 Funktionen.
    Es werden im Laufe der nächsten Jahre (10-20) weitere Gruppen und Gruppenmitglieder hinzukommen.

    In den einzelnen Programmen muss ich sprechende Namen haben (diese Programme sollen von nicht SW-Spezi´s geschreiben werden), d.h ich muß mit GetProcAdress jede Funktion einzeln holen und einem sinnvoll benamten Funktionspointer zuweisen. Außerdem muß ich dieses Verfahren dokumentieren und andere darin einweisen. Diesen ganzen Aufwand möchte ich minimieren. Außerdem soll die Laufzeit minimiert werden, es dar nicht sein das die Initialisierung eines 5 Sekunden Tests 2 Sekunden dauert.



  • In COM beschreibst Du zunächst Deine Interfaces. Aus dieser Beschreibung, überlicherweise in IDL, wird Dir dann das benötigte Header-File erzeugt.

    Jetzt kannst Du die Interfaces implementieren. Entgegen Xqgenes Meinung halte ich das für nicht viel Aufwand. Das ist nicht viel mehr als eine handelsübliche Cpp-Klasse zuzüglich drei besonderer Methoden. Der übrige Aufwand ist vom verwendeten Hilfsmittel abhängig.

    In Deiner Anwendung erstellst Du dann eine Objekt-Instanz durch CoCreateInstance. Vergleichbar ist das mit einer Objekt-Erstellung mittels new.

    Über die Kategorien kann ein Objekt mitteilen, welche Interfaces es implementiert. Das System stellt Dir ein Objekt zur Enumeration zur Verfügung. Dadurch können Dir die Namen der Dlls und deren Position völlig wurscht sein.

    COM selbst kann ich Dir in Kürze aber nicht erklären. Auf die Schnelle fällt mir auch "nur" Erhard ein.



  • Hast du dein Programm und die DLL in einem Ordner und startest 2 Mal das Programm wird die DLL nur 1 Mal geladen und man kann darin auch SharedObjekte verwenden z.B.

    #pragma data_seg ("shared")
    
    char globstring[256][64] = {'\0'};
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    

    Hier kann jede Programm instanz darauf zugreifen. Schreibt eine etwas rein kann die andere es auslesen.

    Kopiertst du diesen Ordner und startest das gleiche Programm jedoch aus unterschiedlichen Ordnern wird die DLL ein 2tes mal geladen obwohl sie gleich sind.

    So wie ich es verstanden habe soll dein Programm nur die Ausgabe sein.
    Dadurch kannst du die Funktionen selbst in eine DLL auslagern .
    Das einzige was alle DLL gleich haben müssen ist der Einsprungspunkt. Ich habe das bereits bei meinem System implementiert.
    Das Programm bleibt gleich und die DLL sind dann bei mir die Applikationen welche immer etwas anderes ausführen.
    So brauchst du in Zukunft nur eine neue DLL erstellen welche deine Prüffunktionen beinhaltet. Vom Hauptprogramm wird dann nur der Einsprungspunkt der DLL mit einem bestimmten Namen aufgerufen



  • @Unix-Tom
    Nur nochmal zur Betstätigung:
    Folgende Directorystruktur

    d:\test
       |
       +- bin
       |  |
       |  +- Programm.exe int main(){ a();sleep(10000);return 0;} 
       +- dir_1
       |  |
       |  +- test.dll  mit der Funktion void a(void){printf("Grün\n");}
       +- dir_2
          |
          +- test.dll  mit der Funktion void a(void){printf("Rot\n");}
    

    folgende Aufrufe

    cd d:\test\dir1
    \test\bin\Programm
    cd d:\test\dir2
    \test\bin\Programm
    

    führen zu dem Ergebniss

    Grün
    Rot
    


  • Ja
    Bei Windows wird nicht unterschieden wie die DLL heißt sondern von wo sie aufgerufen wird.
    Wenn die gleiche DLL in 2 Unterschiedlichen Verzeichnissen ist dan nsind sie für Windows auch verschieden.
    Zuerst sucht WINDOWS im Pfad des aufrufenden Programmes. Findet es dort nichts dann in den Suchpfaden von Windows selbst.



  • @Unix-Tom
    Danke.

    Habe inzwischen auch die Zeit gehabt es auszuprobieren, es funktioniert einwandfrei.

    Bei Windows wird nicht unterschieden wie die DLL heißt sondern von wo sie aufgerufen wird.
    Wenn die gleiche DLL in 2 Unterschiedlichen Verzeichnissen ist dan nsind sie für Windows auch verschieden.

    Wo hast du diese Information her



  • PAD schrieb:

    Wo hast du diese Information her

    Na aus der Doku zu LoadLibrary...



  • 😃 Danke,
    Mann sollte halt öfter daran denken: rtfm



  • Xqgene schrieb:

    PAD schrieb:

    Wo hast du diese Information her

    Na aus der Doku zu LoadLibrary...

    Nein habe ich nicht aus der MSDN sondern aus der Schulung zum MCSE



  • Xqgene schrieb:

    PAD schrieb:

    Wo hast du diese Information her

    Na aus der Doku zu LoadLibrary...

    Nein habe ich nicht aus der MSDN sondern aus der Schulung zum MCSE



  • ist ja auch Microsoft 🙂


Anmelden zum Antworten