Thema: Delphi was macht Dienst gerade?

Einzelnen Beitrag anzeigen

Benutzerbild von fiasko
fiasko

Registriert seit: 10. Dez 2002
Ort: Dresden
506 Beiträge
 
#7

Re: was macht Dienst gerade?

  Alt 16. Nov 2004, 09:29
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 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 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 - besser ist denke ich das onCreate.

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 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.
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 ).
Thomas Liske
Posts comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  Mit Zitat antworten Zitat