Einzelnen Beitrag anzeigen

schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#1

Messages bei Named Pipes?

  Alt 8. Feb 2010, 17:56
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.
  Mit Zitat antworten Zitat