![]() |
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 |
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.
|
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 |
Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
Könntest mir nicht mal ein kurzes Beispiel posten?
|
Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
Mit
![]() ![]() ![]() Sieh mal im MSDN nach, dort gibt's auch Beispiele. |
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. |
Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
Hi,
schau mal hier: ![]() Da findest Du eine Komponente, welche das tut. Etwas weiter unten ist auch noch ein Beispiel, welches die Verwendung zeigt ;) ...:cat:... |
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:
Programm B:
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;
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; |
Re: Zwei Prozesse mittels NamedPipe/ Pipe kommunizieren lass
Kleiner Nachtrag: so funktioniert die ganze Sache:
Programm A:
Delphi-Quellcode:
Programm B:
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;
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 01:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz