Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lassen (https://www.delphipraxis.net/29145-zwei-prozesse-mittels-namedpipe-pipe-kommunizieren-lassen.html)

Scorpion3000 4. Sep 2004 15:16


Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lassen
 
Hallo zusammen!

Ich hänge jetzt schon mehrere Stunden vor dem Internet konnte allerdings nichts finden, was mir weiter helfen könnte.
Zu meinem Problem: Ich möchte zwei Prgr mittels NamedPipe oder auch Pipe kommunizieren lassen.
Die beiden Prgr befinden sich auf dem selben Pc allerdings unter verschiedenen Benutzern (Remote Desktop).
Ich erstelle mittels CreateNamedPipe bzw CreatePipe im Prog A eine Pipe und nun steh ich an. Wenn ich jetzt CreatePipe verwende muss ich irgendwie das Handle an Prog B übermitteln. Die verschiedenen Erklärungen in der MSDN helfen mir auch nicht weiter. :wall:

Grüße scoprion3000

Dax 4. Sep 2004 15:29

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Wenn die Programme unter dem selben Benutzer laufen, klappts bei mir immer. Über's Netzwerk soll's laut MSDN ja auch funktionieren. Aber da an deinem Rechner nicht auf zwei Konten gelichzeitig gearbeitet wird, denke ich, das das eine Ende der Pipe die Messages gar nicht bekommt.

Scorpion3000 4. Sep 2004 15:47

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Danke für die superschnelle Antwort, aber mein Problem ist: Wie setzte ich die ganze Sache Quelltext-mäßig um?

Grüße scorpion3000

Scorpion3000 4. Sep 2004 15:47

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Könntest mir nicht mal ein kurzes Beispiel posten?

Dax 4. Sep 2004 15:49

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Mit MSDN-Library durchsuchenCreateNamedPipe, MSDN-Library durchsuchenTransactNamedPipe, MSDN-Library durchsuchenConnectNamedPipe, und so weiter.
Sieh mal im MSDN nach, dort gibt's auch Beispiele.

Robert Marquardt 4. Sep 2004 15:53

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Bei einer Named Pipe rufen einfach beide Seiten CreateNamedPipe auf.
Eine anonyme Pipe wird geoeffnet und dann der Prozess fuer das andere Ende der Pipe mit CreateProcess gestartet.
Dabei muss der Prozess die offenen Filehandles erben.

sakura 4. Sep 2004 15:53

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Hi,

schau mal hier: http://www.delphipraxis.net/internal...?p=36961#36961

Da findest Du eine Komponente, welche das tut. Etwas weiter unten ist auch noch ein Beispiel, welches die Verwendung zeigt ;)

...:cat:...

Scorpion3000 4. Sep 2004 16:21

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Also ich hab mir mal das alles durchgelsen. Allerdings funzt das iregendwie nicht.

Programm A:
Delphi-Quellcode:
var
  Form1: TForm1;
  Pipe : THandle;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  FSA: SECURITY_ATTRIBUTES;
  FSD: SECURITY_DESCRIPTOR;
begin
   InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(@FSD, True, nil, False);
   FSA.lpSecurityDescriptor := @FSD;
   FSA.nLength := sizeof(SECURITY_ATTRIBUTES);
   FSA.bInheritHandle := True;

   Pipe:= CreateNamedPipe('test', PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE or
    PIPE_READMODE_MESSAGE or PIPE_WAIT or SECURITY_ANONYMOUS,
    PIPE_UNLIMITED_INSTANCES, 1024,
    1024, NMPWAIT_USE_DEFAULT_WAIT, @FSA);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: string;
   dw   : dword;
begin
   buffer:= 'test';
   WriteFile(Pipe, buffer, sizeof(buffer), dw, nil);
end;
Programm B:
Delphi-Quellcode:
var
  Form1: TForm1;
  pipe : THandle;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  FSA: SECURITY_ATTRIBUTES;
  FSD: SECURITY_DESCRIPTOR;
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('test'), PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE or
    PIPE_READMODE_MESSAGE or PIPE_WAIT or SECURITY_ANONYMOUS,
    PIPE_UNLIMITED_INSTANCES, 1024,
    1024, NMPWAIT_USE_DEFAULT_WAIT, @FSA);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: string;
   dw   : dword;
begin
   ReadFile(pipe, Buffer, 100, dw, nil);
   Label1.Caption:= buffer;
end;

Scorpion3000 31. Jan 2005 12:16

Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
 
Kleiner Nachtrag: so funktioniert die ganze Sache:

Programm A:
Delphi-Quellcode:
procedure TForm1.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 TForm1.Button1Click(Sender: TObject);
var
   buffer: shortstring;
   dw   : dword;
   b1    : boolean;
begin
   buffer:= 'Test';
   WriteFile(Pipe, buffer, sizeof(buffer), dw, nil);
end;
Programm B:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
   FSA : SECURITY_ATTRIBUTES;
   FSD : SECURITY_DESCRIPTOR;
begin
   InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(@FSD, True, nil, False);
   FSA.lpSecurityDescriptor := @FSD;
   FSA.nLength := sizeof(SECURITY_ATTRIBUTES);
   FSA.bInheritHandle := True;

   Pipe:= CreateFile(PChar('\\.\pipe\<test>'),
                     GENERIC_READ or GENERIC_WRITE,
                     0,
                     @FSA,
                     OPEN_EXISTING,
                     0,
                     0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: shortstring;
   dw   : dword;
begin
   ReadFile(Pipe, buffer, sizeof(buffer), dw, nil);
end;

Mfg Scorpion3000


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz