![]() |
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 |
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 |
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... |
Re: was macht Dienst gerade?
Bedarf ist vorhanden, das wäre ganz lieb, Danke schon mal
|
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:
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.
procedure ReadData(Sender: TObject; ServerPipe: TAbstractPipe; Buffer: Pointer; BuffSize: DWord);
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... |
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:
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.
constructor TMThread.Create(CreateSuspended: Boolean);
begin inherited Create(CreateSuspended); Priority := tpLowest; //PipeLine erzeugen MultiServerPipe:=TMultiServerPipe.Create('DienstAktuell'); end;
Delphi-Quellcode:
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?:
MultiServerPipe.Write(Programm, sizeof(Programm), BuffSize);
Delphi-Quellcode:
Bei der Create-Methode will er aber noch einen Parameter haben, FSecurityAttributes.
ClientPipe.Create('DienstAktuell');
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);
|
Re: was macht Dienst gerade?
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
var
sa: _SECURITY_ATTRIBUTES; //... sa.nLength:=sizeof(sa); sa.lpSecurityDescriptor:=nil; sa.bInheritHandle:=false; foo = TClientPipe.Create('DienstAktuell',sa); Zitat:
Delphi-Quellcode:
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 ;-)).
// 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; |
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] |
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.... |
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. |
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