Hallo,
Ein besserer Titel fällt mir leider nicht ein.
Angeregt durch die Fragen einens anderen
DP Nutzers bezüglich Named Pipes habe ich da auch mal bissl getöbert und eine Lösung gefunfen, bei der zwischen Pipe Client und Pipe Server in beiden Richtungen Daten ausgetauscht werden können. Dabei wird aber beim Senden ein Button betätigt, beim Empfangen noch einmal ein Button, der den Empfang der Daten auslöst.
Nun meine Überlegung: Das sollte doch auch über Windows Messages zu steuern sein. An Stelle der Ereignisse BtnSendClick / BtnReceiveClick müsste doch auch eine Windows Message gesendet werden können. Geht das dann analog der Message Schleife in einer gewöhlichen Anwendung, was ich mir wegen der zwie entfernten Programme nicht vorstellen kann, oder geht das vielmehr über die Overlapped Struktur, die ich optional als letzten Parameter bei RedFile() bzw. Writefile() übergeben kann.
Ich will vom PipeClient aus den Server mit Kommandos steuern. Da nun eh das Flag PIPE_TYPE_MESSAGE gesetzt ist, sollte das doch mit Windows Messages klappen?
Aber wie mach ich das hier? Genügt es, den Overlapped-Puffer mit zu übergeben und dort die Message rein zu packen, oder muss ich mehr machen. Leider ist das
MSDN nicht besonders verständlich, um dort Informationen darüber zu gewinnen.
Um außerdem ein Ereignis auslösen zu können, muss ich ja eine WMxxxxx Methode schreiben, die die Message in ein
VCL Ereignis umwandelt.
Statt BtnSendClick() brauche ich ein Ereignis OnDataAvailable
Statt BtnReceiveClick brauche ich ein Ereignis OnCommandToExecute
im Server
und im Client
statt BtnSendClick() -> OnServerCommandToExecute
statt BtnReceiveClick -> OnDataFromServerAvailable
Werd mir jezt erst mal das
WinAPI Handbuch zu Gemüte Führen.
Delphi-Quellcode:
procedure TfrmPipeSrv.FormCreate(Sender: TObject);
var
FSA : SECURITY_ATTRIBUTES;
FSD : SECURITY_DESCRIPTOR;
pch1: shortstring;
begin
InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@FSD, True, nil, False);
FSA.lpSecurityDescriptor := @FSD;
FSA.nLength := sizeof(SECURITY_ATTRIBUTES);
FSA.bInheritHandle := True;
Pipe:= CreateNamedPipe(PChar('\\.\pipe\<test>'),
PIPE_ACCESS_DUPLEX or FILE_FLAG_WRITE_THROUGH,
PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_NOWAIT,
PIPE_UNLIMITED_INSTANCES,
1024,
1024,
50,
@FSA);
end;
procedure TfrmPipeSrv.btnSendClick(Sender: TObject);
var
buffer: shortstring;
dw : dword;
b1 : boolean;
begin
buffer := pServer.Lines[0];
WriteFile(Pipe, buffer, sizeof(buffer), dw, nil);
end;
procedure TfrmPipeSrv.btnReceiveClick(Sender: TObject);
var
buffer: shortstring;
dw : dword;
begin
ReadFile(Pipe, buffer, sizeof(buffer), dw, nil);
pServer.Lines.Add(buffer);
end;
Wenn ich mehr weiß, werde ich das hier kundtun. Villeicht sogar als kleines Tutorial!
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.