Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Befehle von einem Service an eine Exe senden (https://www.delphipraxis.net/187423-befehle-von-einem-service-eine-exe-senden.html)

Shark99 27. Nov 2015 20:04

Befehle von einem Service an eine Exe senden
 
Ich habe einen Service und eine Exe. Der Service läuft mit Admin rechten, die Exe nicht. Bei bestimmten Events wird die Exe vom Service informiert. Es ist derzeit so implementiert dass die Exe einen Indy TCP Server hat, der Service einen Indy TCP client. Der Service loggt sich ein und kann so die Daten (immer ein Byte pro Stunde) übertragen.

Das funktioniert zwar, aber in der (größeren) Firma wo es eingesetzt kommt es immer wieder zu Problemen weil der Serverport geblockt wird. (Sehr chaotische Software-Zustände zwischen verschiedenen Abteilungen).

Gibt es vielleicht eine einfachere Methode um ein Byte an Daten von einem Service an eine Exe weiterzuleiten?

SendMessage() oder PostMessage() kommt ja nicht in Frage, weil der Service und die Exe in einer jeweils anderen Windows Station laufen.

Also habe ich es mit Named Pipes versucht. Es klappte zuerst. Jedoch dann bekam ich Feedback dass ich einer der Abteilungen meine Exe mit sehr niedrigen Systemrechten läuft (die gleichen wie der Internet Explorer) und dadurch keine Pipe Verbindung zu stande kommt.

Hat jemand von euch eine andere Idee?

Sir Rufo 27. Nov 2015 20:19

AW: Befehle von einem Service an eine Exe senden
 
Dreh das Szenario einfach um.

Die Service-Anwendung hat den TCP Server und die Client-Anwendung den TCP Client.

Die Client-Anwendung fragt nun (am sinnvollsten in einem Thread) in regelmässigen Abständen den Server und der gibt dann die Information heraus.

Schon haben sich deine Probleme erledigt.

Bernhard Geyer 27. Nov 2015 20:26

AW: Befehle von einem Service an eine Exe senden
 
wenn die Admin nicht mitspielen wird als kleinste gemeinsamer Nenner ein Austauschdatei übrig bleiben.

Shark99 27. Nov 2015 20:26

AW: Befehle von einem Service an eine Exe senden
 
Danke soweit.

Wenn die Daten übertragen werden ist es ziemlich zeitkritisch. d.h. ich müsste mindestens zwei mal in der Sekunde den Service per TCP/IP pollen. Es würde zwar funktionieren, aber elegant ist es nicht. Etwas event-basiertes wäre mit viel lieber.

Die Datei-Lösung würde auch funktionieren. Der Service würde ein Temp-Verzeichnis schreiben, die Exe müsste dieses auf Dateiänderungen überwachen, dann die Datei öffnen und das Byte lesen. Ist leider auch alles andere als elegant. Es würde auch schlafende Festplatten unnötig aus dem Standby wecken.

Ich hoffe jemand hat einen genialen Einfall. :)

Luckie 28. Nov 2015 00:12

AW: Befehle von einem Service an eine Exe senden
 
Man kann einer Exe "verbieten" Pipes zu erstellen bzw, aus ihnen zu lesen?

Klaus01 28. Nov 2015 08:32

AW: Befehle von einem Service an eine Exe senden
 
.. wenn das so zeitkritisch ist, warum bleibt die TCP Verbindung dann nicht bestehen.

Grüße
Klaus

Shark99 28. Nov 2015 11:09

AW: Befehle von einem Service an eine Exe senden
 
Zitat:

Zitat von Luckie (Beitrag 1322753)
Man kann einer Exe "verbieten" Pipes zu erstellen bzw, aus ihnen zu lesen?

Man bekommt access denied wenn die Exe mit den Rechten des IE läuft. Man kann nur auf die Pipes zugreifen die in der gleichen Ebene liegen.

Zitat:

Zitat von Klaus01 (Beitrag 1322761)
.. wenn das so zeitkritisch ist, warum bleibt die TCP Verbindung dann nicht bestehen.

Grüße
Klaus

Bleibt sie ja auch. Der Server loggt sich bei der Exe ein sobald ein User auf dem Desktop einlogt. Aber wenn wie vorgeschlagen ich es anders mache und mich mit der Exe beim Server einlogge muss ich trotzdem im Polling fragen ob neue Daten da, oder nicht?

mjustin 28. Nov 2015 19:10

AW: Befehle von einem Service an eine Exe senden
 
Zitat:

Zitat von Shark99 (Beitrag 1322767)
Aber wenn wie vorgeschlagen ich es anders mache und mich mit der Exe beim Server einlogge muss ich trotzdem im Polling fragen ob neue Daten da, oder nicht?

Nein, denn sobald eine TCP Verbindung aufgebaut ist, ist sie in beiden Richtungen verwendbar, der Server kann jederzeit Daten an den Client senden. Der Client muss nur kontinuierlich aus dem Socket lesen - am einfachsten geht das in einem Hintergrundthread. Wenn der Server in der Zwischenzeit nichts gesendet hat, erhält der Client zwar einen Socket Timeout, aber danach versucht er es sofort wieder, zu Daten zu lesen. (z.B. in einer Schleife).

Dieses sogenannte Server - Pull habe ich für Indy hier mit Quellcode beschrieben:

https://mikejustin.wordpress.com/201...-push-example/

Shark99 28. Nov 2015 19:22

AW: Befehle von einem Service an eine Exe senden
 
Danke sehr! Werde ich versuchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr.

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