Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi was macht Dienst gerade? (https://www.delphipraxis.net/33937-macht-dienst-gerade.html)

Susanne 15. Nov 2004 10:30


was macht Dienst gerade?
 
Hallo,

ich habe einen Dienst, der verschiedene Programme startet. Dann habe ich noch ein anderes Programm, hier würde ich gerne in einer StatusBar anzeigen, welches Programm der Dienst gerade gestartet hat! Geht das? Wenn ja, wie mache ich das?

Gruss
Susanne

alcaeus 15. Nov 2004 10:32

Re: was macht Dienst gerade?
 
Hi Susanne,

du könntest z.B. mit einer Logdatei arbeiten, in die der Dienst reinschreibt, und im Programm regelmäßig den letzten Logeintrag auslesen und anzeigen. Weiters gibts noch einen Weg über Messages, aber davon hab ich leider keine Ahnung :oops:

Greetz
alcaeus

fiasko 15. Nov 2004 10:35

Re: was macht Dienst gerade?
 
Hallo,

ich weiß nicht ob ein Dienst Messages an ein Userland Programm so einfach senden kann, was aber auf jedenfall geht sind Named Pipes. Bei bedarf hab ich irgendwo @home auch noch Code rumliegen wo ich das mal gemacht habe...

Susanne 15. Nov 2004 12:00

Re: was macht Dienst gerade?
 
Bedarf ist vorhanden, das wäre ganz lieb, Danke schon mal

fiasko 15. Nov 2004 20:09

Re: was macht Dienst gerade?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

inzwischen hab ichs gefunden. Man binde einfach die Unit die Anbei ist ein.

Im Dienst macht man dann folgendes:

Man nehme ein TMultiServerPipe Objekt, welches man z.B. im ServiceStart des Dienstes so initialisiert:
Delphi-Quellcode:
MultiServerPipe:=TMultiServerPipe.Create('MyFunnyPipe');
.

Um jetzt Daten zu empfangen muß man sich in das MultiServerPipe.onReadData ereignis einklinken.
Das ReadData muß als Methode wie folgt definiert sein:
Delphi-Quellcode:
procedure ReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord);
Dort drinne kann man auf empfangene Daten in Buffer zugreifen (die die Größe BuffSize haben). Zum direkten antworten an den Sender macht man einfach ein ServerPipe.Write(Buffer,BufferGröße,GeschriebeneBy tes). In GeschriebeneBytes stehen dann die übertragenen Byte Anzahl.

Auf der CLient Seite ist das dann analog, nur das man statt TMultiServerPipe ein TClientPipe nehmen muß.

Der Dienst unterstütz somit von haus aus mehrere parallele Verbindungen, d.h. wenn man vom Dienst außerhalb des ReadData an einen Client senden will, brauch man dessen Verbindungsobjekt, im Prinzip alles änlich den Socket komponenten von Delphi.

Hoffe es war nicht allzuviel unverständliches dabei...

Susanne 16. Nov 2004 08:57

Re: was macht Dienst gerade?
 
Danke, aber so ganz steige ich da noch nicht durch.

Ich habe meinen Dienst und der Soll Daten senden. Die Funktionen des Dienstes sind in einem Thread. Ich habe die unit pipes in mein Projekt eingebunden. und nun habe ich folgendes gemacht


Delphi-Quellcode:
constructor TMThread.Create(CreateSuspended: Boolean);
  begin
    inherited Create(CreateSuspended);
    Priority := tpLowest;
    //PipeLine erzeugen
    MultiServerPipe:=TMultiServerPipe.Create('DienstAktuell');
  end;
und an der Stelle, an der er nun Daten senden soll, z.B. welches Programm er startet da kommt dann was hin? Programm ist die Variable, die das aktuell auszuführende Programm enthält. Was muss statt BuffSize in dem Aufruf stehen? Und das Write bekomme ich auch nicht aufgelistet, wenn ich den Punkt mache.

Delphi-Quellcode:
MultiServerPipe.Write(Programm, sizeof(Programm), BuffSize);
Und mein anderes Programm soll diese Nachricht dann in seiner Oberfläche anzeigen. Dazu brauche ich dann ein TClientPipe. Das erzeuge ich z.B: im OnActivate-Ereignis mit?:
Delphi-Quellcode:
ClientPipe.Create('DienstAktuell');
Bei der Create-Methode will er aber noch einen Parameter haben, FSecurityAttributes.

Und wie lese ich dann, was der Dienst gesendet hat? Und was muss dann bei Sender und ServerPipe stehen? Buffer enthält den gesendeten Text und BuffSize die Grösse des Textes.
Delphi-Quellcode:
ClientPipe.OnReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord);

fiasko 16. Nov 2004 09:29

Re: was macht Dienst gerade?
 
Zitat:

Zitat von Susanne
Was muss statt BuffSize in dem Aufruf stehen?

Einfach eine passende Variable die die Anzahl der erfolgreich geschriebenen Bytes aufnehmen kann. Du mußt das ja dann nicht unbedingt weiter beachten, nur brauch er halt ne Variable wo er das reinschreiben darf.

Zitat:

Zitat von Susanne
Und das Write bekomme ich auch nicht aufgelistet, wenn ich den Punkt mache.

Das liegt daran weil das TMultiServerPipe selbst keine Verbindungen enthält sondern nur auf eingehende Verbindungen wartet. Die existierenden Verbindungen (es könnten sich ja mehrere Programm gleichzeitig verbinden) sind in dem TMultiServerPipe.Servers Array enthalten welche jedes ein TServerPipe Objekt representieren. Mit dem kannst du dann ein write machen. Die Anzahl der Verbindungen bekommt man über Servers.Count heraus.

Zitat:

Zitat von Susanne
Und mein anderes Programm soll diese Nachricht dann in seiner Oberfläche anzeigen. Dazu brauche ich dann ein
TClientPipe. Das erzeuge ich z.B: im OnActivate-Ereignis mit?:

OnActive tritt doch immer auf wenn die Anwendung den Focus erhält :gruebel: - besser ist denke ich das onCreate.

Zitat:

Zitat von Susanne
Bei der Create-Methode will er aber noch einen Parameter haben, FSecurityAttributes.

Mist, übersehen. Man kann den Zugriff auf Pipes beschränken (es gibt auch beim Server ein Create mit FSecurityAttributes Parameter). Der einfache Weg ohne ist folgender:

Delphi-Quellcode:
var
  sa: _SECURITY_ATTRIBUTES;                                                  

//...
  sa.nLength:=sizeof(sa);
  sa.lpSecurityDescriptor:=nil;
  sa.bInheritHandle:=false;
  foo = TClientPipe.Create('DienstAktuell',sa);
Zitat:

Zitat von Susanne
Und wie lese ich dann, was der Dienst gesendet hat? Und was muss dann bei Sender und ServerPipe stehen? Buffer enthält den gesendeten Text und BuffSize die Grösse des Textes.
Delphi-Quellcode:
ClientPipe.OnReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord);

Also wie gesagt, im Server bzw. Client für das onReadData Ereignis registrieren (in der Read Funktion des Clients fehlt der ServerPipe Parameter - dort ist ja immer klar woher es kommt). In dem Speicher wo der Buffer Pointer hinzeigt stehen deine Daten, also z.B.:

Delphi-Quellcode:
// Definition die in beiden gleich sein muß, also am besten in eine gemeinsame Unit rein!
type
  PDienstStatusTyp = ^DienstStatusTyp;
  DienstStatusTyp = record
                      ok: boolean;
                      foo: integer;
                      text: shortstring; // wir können hier keine Pointer verwenden da Daten direkt zum Array gehören müssen - ein ShortString ist ein festes Array!
                    end;

// Client:
procedure TForm1.ReadData(Sender : TObject; Buffer : Pointer; BuffSize : DWord);
begin
   // Übertragungslänge paßt nicht... :-(
  if BuffSize <> sizeof(DienstStatusTyp then
  begin
    ShowMessage('Fehler!');
    exit;
  end;

  ShowMessage(PDienstStatusTyp(Buffer)^.text);
end;

// Server:
var
  h: DienstStatusTyp;
  b: Integer;

//...

for i:=0 to MultiServerPipe.Servers.Count do
begin
  h.text = 'Hallo Client '+IntToStr(i);
  MultiServerPipe.Servers[i].write(h,sizeof(h),b);
end;
es empfiehlt sich vielleicht am Anfang das mal nicht als Dienst durchzuspielen, es können bei den Operationen mit der Pipe Exceptions auftreten die man abfangen muß (vorallem im Dienst, wenn der sich aufhängt ist man sonst sehr oft am rebooten während der Entwicklung ;-)).

Susanne 16. Nov 2004 10:15

Re: was macht Dienst gerade?
 
Ok, heute kapiere ich irgendwie gar nichts. Hast du vielleicht irgendwo auch noch ein Beispiel rumliegen, das ich mir angucken könnte, um dahinter zu steigen?

[edit=Christian Seehase]Doppelpost gelöscht. Mfg, Christian Seehase[/edit]

fiasko 16. Nov 2004 22:45

Re: was macht Dienst gerade?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe jetzt eben mal aus dem alten Projekt die wichtigen Sachen rausgezogen und in zwei normale Anwendungen verpackt. Wenn man ganz brav die Server.exe startet, dort den Create Button und danach die Client.exe und den Create Button drückt dann funzt es auch.

Sobald aber eine Exception im Constructor Auftritt (wenn z.B. der Server noch nicht läuft) dann hängt das Programm total anstatt das man die Exception angezeigt bekommt. Als ich das das letzte mal gemacht habe war dem nicht so :gruebel: allerdings war das noch Win2000+Delphi6 und nicht WinXP+Delphi7. Es sieht so aus als macht da Delphi Müll, jedenfalls macht er Unsinn beim debuggen mit Einzelschritt. Das muß ich erstmal genauer untersuchen....

Susanne 17. Nov 2004 08:38

Re: was macht Dienst gerade?
 
Danke für das Beispiel und die Mühe, werde mir das da dann mal genauer angucken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz