Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variablenwerte zwischen verschiedenen Anwendungen teilen (https://www.delphipraxis.net/137988-variablenwerte-zwischen-verschiedenen-anwendungen-teilen.html)

Ralf Kaiser 1. Aug 2009 16:07


Variablenwerte zwischen verschiedenen Anwendungen teilen
 
Hallo,

wir habe da ein recht grosses Projekt das aus einer Reihe von Anwendungen, COM-Objekten und normalen DLLs besteht.

Bisher war es für einige Teile des Gesamtsystems nur wichtig zu wissen ob z.B. eine bestimmte Anwendung läuft oder eine bestimmte DLL irgendwo geladen ist. Dazu haben die einzelnen Subsysteme jeweils Mutexe mit definierten Namen angelegt. So konnten andere Teile des Systems nachschauen ob ein bestimmter Mutext schon da ist oder nicht. Das funktioniert soweit ganz gut.

Jetzt wird es in Zukunft aber nötig werden, dass ein Teil der Anwendung vom anderen bestimmte Werte auslesen kann.

Dabei scheiden z.B. Messages wie WM_COPYDATA aus, da nicht alle beteiligten Softwarekomponenten über Nachrichtenfenster verfügen und das auch nicht sollen.

Ich hatte zuerst an simple INI-Dateien gedacht über die Werte auszutauschen sind aber das könnte zu Problemen führen wenn ein Teil gerade die INI-Datei schreibt während ein anderer gerade lesen will. Der Zugriff auf so eine INI-Datei müsste dann irgendwie (Mutex, Semaphore) synchronisiert werden. -> nicht so günstig.

Habt Ihr Vorschläge, was man da zum Datenaustausch am besten nehmen könnte? Es wird sich bei den Daten (erst mal) nur um Integerwerte und einige Strings handeln. Allerdings könnte es für Teile der Anwendung nötig sein sehr oft auf diese Daten zuzugreifen, wenn die Werte irgendwo im Speicher stehen wäre das sicher sinnvoll.

Lösungen an die ich gedacht habe wären:

- Memory Mapped Files
- Mailslots
- Named Pipes

Irgendwelche Denkanstösse? Hab ich noch die eine oder andere Möglichkeit vergessen?

Danke schon mal,
Ralf

mjustin 1. Aug 2009 17:29

Re: Variablenwerte zwischen verschiedenen Anwendungen teilen
 
sonstige Möglichkeiten die mir so einfallen:

* ein TCP/IP basierter Kommunikationsserver / Web Service (HTTP, REST)
* eine kleiner Datenbankserver?
* MSMQ (Microsoft Message Queue) oder ein anderer Message Broker?

Eventuell soll das System später auch Bestandteile integrieren können, die auf anderen Plattformen laufen und in anderen Sprachen geschrieben sind? Standards wie HTTP, REST, JSON (oder XML) sind dann leichter integrierbar. Bei Datenbankservern und Message Brokern wäre wichtig, ob es die entsprechenden Client Bibliotheken gibt.

Viele Grüße,

sx2008 1. Aug 2009 18:02

Re: Variablenwerte zwischen verschiedenen Anwendungen teilen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das könnte man auch über COM-Objekte lösen.
Hier erst mal ein Interface.
Delphi-Quellcode:
ISharedData = interface(IDispatch)
  ['{EFFF2A9E-093F-45DA-B5D1-2764026B65DD}']
  function Get_Value(const Name: WideString): OleVariant; safecall;
  procedure Set_Value(const Name: WideString; Value: OleVariant); safecall;
  property Value[const Name: WideString]: OleVariant read Get_Value write Set_Value;
end;
Jede Anwendung befragt zuerst einmal die Running Object Table (ROT) nach einem Objekt mit diesem Interface.
Falls es das Objekt in der ROT noch nicht gibt, wird ein neues anlegt (dass sich selbst in der ROT registiert).
Somit haben alle Anwendungen das gleiche Objekt am Wickel.
Natürlich gibt es eine Factoryklasse, damit die Anwendung sich nicht selbst mit der ROT beschäftigen muss.
Die Klasse, die ISharedData implementiert führt intern eine sortierte Liste von Strings und Variants.
Die Verwendung ist dann recht einfach:
Delphi-Quellcode:
var
  sdata : ISharedData;
...
  sdata.Value['Prog1.RunStatus'] := 1;
...
  if sdata.HasValue('irgendwas') then
    ShowMessage('irgendwas = '+sdata.Value['irgendwas']);


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz