DLL erstell für mehrere Anwendungen



  • Hallo,

    Das ist so nicht ganz richtig. Eine dll kann einen so genannten "shared memory" Teil beinhalten, der dann von mehreren Applikationen genutzt werden kann.

    http://www-w2k.gsi.de/controls/GlobalMemory/globalmemory.htm
    http://bdn.borland.com/article/0,1410,20008,00.html

    Ciao



  • "Ich möchte aber - egal wieviele Anwendungen offen sind- immer auf die selben Varis zugreifen.".....

    und arbeite deshalb mit globalen Variablen !



  • @Jansen:
    Ich muß aber die Werte als Funktionen in einer DLL bereitstellen, und nicht über eine Datei.

    @linux:
    Ich habe ja Globale Variablen in der DLL aber was bringt es wenn eine 2. Anwendung darauf nicht zugreifen kann ???

    @Braunstein
    Die Links, vor allem der untere ist sehr interressant.

    Versuch das gerade in meine DLL einzubauen.
    Hat das so schonmal jemand gemacht mit "Shared Memory Segment" ???

    Vielen Dank

    Alex



  • Auch ein Shared Memory Segment überlebt es nicht, wenn die DLL von keiner Anwendung mehr geladen ist.



  • Ja, aber es giebt in meinem Fall eine "Master-Anwendung" die als TService-Aplication programmiert ist und immer läuft. Diese soll auch die Daten bereitstellen die dann von anderen Applikationen abgerufen werden können.

    Kann mir jemand erklären wie das mit dem Sahred Mem. im einzelnen funktioniert?
    Der Borland Link erklärt es zwar, aber ich Blick das trotzdem nicht so ganz.

    Viele Grüsse

    Alex



  • Dann sollten sich die anderen Anwendungen ihre Daten aus der 'Master-Anwendung' holen und nicht aus irgendeiner DLL. Dies z.B. kann mit Pipes oder über ein COM-Interface erreicht werden.



  • OK, können dann die anderen Anwendungen direkt auf die freigegebenen Funcs zugreifen?

    Geht das dann auch mit Anwendungen die nicht im C++ Code erstellt sind sondern in JAVA??

    Und welche Möglichkeit ist die einfachere?



  • Hier mal meine Shared.def, die Probleme macht:

    LIBRARY UnDLL     // UnDLL ist meine DLL-Datei
    
    SEGMENTS
      SHSEG CLASS 'SHCLASS' SHARED
    

    [C++ Fehler] Shared.def(1): E2141 Fehler in der Deklarationssyntax
    [C++ Warnung] Shared.def(4): W8098 Ungültige mehrstellige Zeichenkonstante
    [C++ Fehler] Shared.def(4): E2129 char-Konstanten dürfen ein oder zwei Zeichen lang sein

    Was ist hier Falsch ? In der ersten Zeile habe ich den Dateinamen meiner DLL eingetragen.



  • Könnte es vielleicht an der compilier-Reihenfolge liegen ???

    Kann mir bitte jemand helfen ???

    Grüsse



  • ... Natürlich kannst Du ganz viele, ganz komplizierte Sachen machen.

    Oder du lässt die aufrufenden Programme zunächst auf einen Conector zugreifen.
    Ein Programm (oder statische DLL) mit nur zwei wesentlichen Inhalten. Die globale Variable. Eine Funktion zum Aufruf der eigentlichen DLL's (Übergeben als Zeiger oder Referenz).

    Die eigentliche DLL schreibt dann in die globale Variable des Conector, andere DLL's können Sie dort abholen und ihrerseits neue Aufrufe absetzen.

    Du musst nur dafür sorgen, dass dein Conector über die gesamte Laufzeit "Online" bleibt.

    Oder du schreibst direkt in die Registry.



  • linux schrieb:

    ...mit nur zwei wesentlichen Inhalten. Die globale Variable. Eine Funktion zum Aufruf der eigentlichen DLL's (Übergeben als Zeiger oder Referenz).

    Wie kann ich aus der DLL auf eine Variable eines Programmes zugreifen?
    Haste mal nen Beispiel-Code?

    linux schrieb:

    Du musst nur dafür sorgen, dass dein Conector über die gesamte Laufzeit "Online" bleibt..

    Ich hab ja den TServiceApplication laufen als Dienst (immer!).
    Diese könnte doch mein Connector sein- oder?
    In diesem Dienst stehen auch die globalen Variablen die ich vorhabe über die DLL bereitzustellen.
    Nur ich weiss eben nicht wie ich aus der DLL auf die Variablen des Dienstes zugreifen kann.

    Wenn ich es also richtig verstanden habe sieht das in der DLL so aus:

    float GetData()
     {
        (Hol die Daten aus den glob. Varies des Dienstes)
        return Data; 
     }
    
    void SetData(float Data)
      {
       schreibe die Daten in den Dienst
      }
    

    Könnt Ihr mir sagen wie der Code in den Funcs auszusehen hat und eas ich beachten muß?
    Hmm... könnt Ihr mir helfen?



  • DLL's/Programme <-> Connector <-> TServiceApplikation

    Connector enthält:
    int MyGobalVar;
    HINSTANCE Handle;
    ------------------------
    void ändereVariable(int);
    void ansehenVariable(int *);
    void bekommeHinstanceWert(HINSTANCE *);

    Unterschiedliche DLL's/Programme rufen die Funktion zum Ändern oder Ansehen der Variablen auf (müssen sich unter u.U. erst den Handle *HINSTANCE-Wert* des Connectors mit GetModuleHandle(NameDesConnector) besorgen).
    Dabei übergeben Sie ihren HINSTANCE-Wert.

    TServiceApplication greift auf MyGlobalVar und Handle zu und kann die DLL's ggf. unmittelbar beenden.

    Vorteil: TServiceApplication muss selbst keinerlei Kenntniss über aufrufende DLL's/Programme haben und braucht nicht verändert werden, auch wenn Weitere DLL's/Programme dazukommen.



  • typedef int(* ändereVariable)(int);
    ändereVariable pfn_ändereVariable = NULL;

    HMODULE hMyLibXY;
    hMyLibXY=LoadLibrary("C:\...\\Projects\\Connector.dll");
    if(hMyLibXY == NULL)
    {
    cout<<"Fehler";
    //return 1;
    }

    // Durch die Funktion GetProcAdress() werden die Adressen der Funktionen der
    // DLL-Datei herausgefunden.
    pfn_ändereVariable = (ändereVariable)GetProcAddress(hMyLibXY,"Connector");

    Hoffe das hilft Dir.



  • Hallo,

    danke erstmal für die Tipps.

    Ich möchte das ganze aber mit dem "shared-memory-segment" machen.

    Irgenwie hab ich in meinem Projekt einen Fehler drinn, und weiss micht wo ich suchen soll.

    Hat das schon mal jemand gemacht bzw. hat jemand ein Beispielprojekt das er mir zusenden kann ?

    Vielen Dank....



  • Hallo miteinander,

    Ich schreibe auch gerade ein DLL mit "Shared Memory Segment".

    Aber es funktioniert nicht so richtig, weil ich irgenwas noch nicht verstehe.

    Könntet Ihr mir ,-da Ihr euch anscheinend damit recht gut auskennt, eine Schritt f Schritt Erklärung geben, damit ich das ganze verstehen kann, und vielleicht meinen Fehler finde ?

    Ich habe mich nach dem oben genannten Link orientiert, aber wie gesagt orgendwo ist noch n Fehler drinn.
    http://bdn.borland.com/article/0,1410,20008,00.html

    Ich habe die DLL statisch gelingt.

    Viele Grüsse
    Aron


Anmelden zum Antworten