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
).