Announcement

Collapse
No announcement yet.

Variablen für alle Prozesse in DLL's

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Variablen für alle Prozesse in DLL's

    Wie kann ich eine 32-Bit DLL erstellen, welche nur ein von allen Prozessen gemeinsam genutztes DATA-Segment hat??

    Oder einfacher:

    Wie kann ich in einer DLL eine Variable vergeben, die von allen Prozessen gemeinsam genutzt wird.

    Die Vorgabe einer *.def Datei mit folgenden Daten hat nix gebracht:
    <pre>
    LIBRARY URLMESSAGE
    DESCRIPTION 'URL-Message'
    CODE MOVEABLE LOADONCALL
    DATA SINGLE
    HEAPSIZE 1024
    STACKSIZE 5120

    EXPORTS
    ...

    </PRE>
    ....

    Danke
    Christian

  • #2
    Hallo Christian,

    Daten, auch wenn sie in DLL's gepackt werden, sind immer auf einen Prozess bezogen. Der gemeinsame Zugriff auf Variablen ist so nicht möglich. Hierfür muß Shared Memory erzeugt und entsprechend benutzt werden.

    Gruß Ud

    Comment


    • #3
      Vielleicht hilft Dir das weiter:<br>
      http://www.entwickler-forum.de\webx?128@@.ee8c498<p>
      Schöne Grüße, Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        Danke

        Aber wie geht denn dan dass (die pragmas kennt der C++Builder nicht):

        (von: http://www.thecodeproject.com/dll/trackuseridle.asp)

        We maintain a set of variables in a shared data segment so that we have only one instance of each variable in all processes. The most important variable here is g_dwLastTick, which stores the time when the last user input event occurred. We are also storing the last known position of the mouse to filter off spurious mouse events. See Mouse Woes for more details.

        #pragma data_seg(".IdleTracker")
        HHOOK g_hHkKeyboard = NULL; // handle to the keyboard hook
        HHOOK g_hHkMouse = NULL; // handle to the mouse hook
        DWORD g_dwLastTick = 0; // tick time of last input event
        LONG g_mouseLocX = -1; // x-location of mouse position
        LONG g_mouseLocY = -1; // y-location of mouse position
        #pragma data_seg()
        #pragma comment(linker, "/section:.IdleTrac,rws")

        DLL Initializatio
        Christian

        Comment


        • #5
          Tja konnte das nur mit Shared Memory lösen

          Dank
          Christian

          Comment


          • #6
            Shared Memory Support in DLL applikationsübergreifend möglich?

            Guten Tag!

            Da ich in der Suche zu "Shared Segment Data" auf diesen Beitrag von Dir gestoßen bin, Christian, und ich heute vor genau diesem Problem stehe, wie ein gemeinsames Datensegment in einer DLL von verschiedenen Anwendungen genutzt werden kann (Übergabe von Daten von einer Anwendung an eine Andere), will ich meine Frage hier anfügen.

            In der mir vorliegenden Ausgabe des Buches "C++Builder6 Developer's Guide", ist im Kapitel 16 eine Möglichkeit beschrieben, die als gleichwertiger Ersatz für die entsprechende VC-Option genannt wird:

            Statt

            #pragma data_seg("-sdata")
            int Num =0;
            double dClose;
            ...
            weitere "Inter-Applikationsvariable"
            ...
            #pragma data_seg()
            ... "normale" DLL variable

            wie der Befehlsblock in VC++ aussieht, wird im BCB6 die Unterstützung eines gemeinsamen Speicherbereiches durch eine eigene "Definition"-CPP-Datei im Buch beschreiben. Das sieht dann etwa so aus:

            #pragma option -zRSHSEG
            #pragma option -zTSHCLS
            int Num = 0;
            double dClose;
            ...
            weitere "Inter-Applikationsvariable"
            ...

            Selbstverständlich sind dann die entsprechenden Variablen in den Funktionsprogramm-Dateien der DLL über "extern" zu deklarieren.

            Das Erstellen der DLL mit dieser eingebundenen Datei verlief fehlerfrei. Jedoch bei der Erzeugung der .DEF Datei fehlte bereits das dritte Element, das der SEGMENT-Liste.

            So ist es wohl auch nicht überraschend, das die erhoffte Wirkung dieser Arbeit ausgeblieben ist.

            Konkret: Ich arbeite mit einem Börsen-Chart-Programm (TradeStation), in dem die Möglichkeit besteht, mit der eingebauten Programiersprache "EasyLanguage", DLL-Funktionen aufzurufen und abzuarbeiten. Mit der von mir Erstellten DLL, die nach o.g. Schema die Erweiterung zur Unterstützung des gemeinsamen Speichers beinhaltet, sind alle gewünschten Operationen innerhalb der Applikation "TradeStation" wunschgemäß.

            Jedoch ist beabsichtigt, die Daten des gemeinsamen Speicherbereichs, auch von EXCEL her abzurufen und/oder einzuschreiben, eben als "Inter-Applikationsdaten".

            Das klappt leider nicht. Der Versuch, die DLL-Funktion über EXCEL-VBA auszuführen, verläuft zwar ohne Fehler. So wurde eine Variable in dem deklarierten Bereich der DLL mit einer DLL-Set-Funktion gesetzt und auch mit einer Get-Funktion wieder ausgelesen, doch der übergreifende Effekt bleibt versagt.

            Innerhalb einer Instanz der MDI-Applikation EXCEL, ist der Datenaustausch möglich (in Mappe1 wird eine Variable in den DLL-"SHSEG"-Speicher eingeladen, die dann in einer Mappe2 wieder aus diesem Speicher ausgelesen wird).

            Sobald jedoch eine weitere Instanz von EXCEL aufgerufen wird, in der ebenfalls auf diese DLL zugegriffen wird, liefert das Auslesen der "SHSEG"-Variablen den vorbesetzten Wert 0.

            Nun hoffe ich, dass Du, Christian, oder ein andere Leser, einen Lösungshinweis mir geben kann. Wenn es hilfreich ist, kann ich gerne den Code der DLL mit den ensprechenden Grundfunktionen hier zur Auswertung bereitstellen.

            Danke für das Lesen meiner Anfrage.

            Gruß
            Uw

            Comment


            • #7
              Hallo,

              mein zuvor beschriebenes Etappen-Problem ist für meine Aufgabe gelöst. Die Übergabe von Daten zwischen den Applikationen erfolgt nun erwartungsgemäß.

              Durch das nicht vollständige Zusammenstellung der Dateien im "Project-Manager"-Fenster, konnte der gemeinsame Speicherbereich wohl nicht festgelegt werden. War dann doch mein Fehler.

              Gruß,
              Uw

              Comment


              • #8
                Hallo Uwe,

                habe das gleiche problem, das du hattest.

                Ich habe die DLL genau wie du mit den externen Variablen erstellt, jedoch meckert der Compiler über die eingebundene, von mir erstellte, *.def-Datei. Wenn ich diese weglasse (nicht einbinde) dann compiliert er fehlerlos, jedoch der gewünschte erfolg bleibt aus, und jedes aufrufende Programm erhält neue Instanzen der Variablen, somit ist auch eine gegenseitige Kommunikation der Programme nicht möglich.

                Da es sich um die gleichen "Symptome" wie bei dir handelt, hoffe ich Du könntest mir helfen, ich hänge nun schon seit Wochen an dem Problem.

                Ich könnte auch meinen Code zeigen um ihn zu analysieren.

                Grüsse...

                Comment


                • #9
                  Hallo alle miteinander,

                  ich möchte eine gemeinsames Data Segment für mehrere Anwendungen erstellen.
                  Wenn ich jedoch wie hier beschrieben vorgehe, bleibt der erwünschte Effekt aus .

                  Weiss jemand welche Dateien ich zum Projekt hinzufügen muss, oder was ich manuell mi der *.Def Datei machen muss.

                  Bin für alle Tips dankbar!

                  viele Grüss

                  Comment

                  Working...
                  X