![]() |
Merkwürdiges Verhalten von Named Pipes unter Win7
Hallo in die Runde :),
ich muss die Gemeinde mal wieder mit einem Problem belästigen, das ich selbst weder verstehe noch ohne Hilfe weiter untersuchen kann. Kurz zur Vorgeschichte: Ich stieß kürzlich auf ein sehr merkwürdiges Verhalten einer meiner Applikationen unter Win7 mit IE10 und IE11 (mit IE8 oder IE9 trat das nicht auf), das irgendwie so aussah, als ob die benutzte Named Pipe blockiert ist. Also hab ich das genauer untersucht und eine Testapplikation geschrieben und das Problem dort in ähnlicher Art nachstellen können. Was ist das Problem? Jedes Senden eines Strings durch den Client erhöht die Anzahl der Instanzen auf der Pipe, wie man mit ![]() Lustigerweise tritt es mit der Testapplikation auch mit IE8 auf. Und es wird noch kurioser: es kommt nur zum Problem, wenn der Pipe-Server ein Manifest benutzt, das einerseits Laufzeit-Themes aktiviert und andererseits Kompatibilität mit Win7 beinhaltet; sobald eine der beiden Bedingungen nicht mehr zutrifft, ist das Problem verschwunden. Unter XP lässt sich das Problem gar nicht nachvollziehen; andere Windows-Versionen hab ich mit den Testprogrammen nicht getestet. Aber kommen wir zum Wesentlichen: Ich benutze die Pipes-Komponente von Russell Libby, die man z.B. von ![]() Server:
Delphi-Quellcode:
Client:
unit Main;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Pipes, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; PipeServer1: TPipeServer; Button1: TButton; Edit1: TEdit; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure PipeServer1PipeMessage(Sender: TObject; Pipe: Cardinal; Stream: TStream); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} {$R XP.res} procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin PipeServer1.Active:= False; end; procedure TForm1.PipeServer1PipeMessage(Sender: TObject; Pipe: Cardinal; Stream: TStream); var text: string; dummy: integer; buffer: array of char; begin SetLength(buffer, Stream.Size); dummy:= Stream.Read(buffer[0], Stream.Size); text:= String(PChar(buffer)); SetLength(buffer, 0); Memo1.Lines.Add(text); end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add(IntToStr(PipeServer1.ClientCount) + ' clients connected'); PipeServer1.Active:= False; PipeServer1.PipeName:= Edit1.Text; PipeServer1.Active:= True; end; end.
Delphi-Quellcode:
Kann das Problem jemand nachvollziehen? Hatte das jemand bereits? Wie kann ich weiter vorgehen?
unit Main;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Pipes, StdCtrls; type TForm1 = class(TForm) PipeClient1: TPipeClient; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var myString: string; iLength: integer; begin if PipeClient1.Connect(5000) then begin myString:= Edit1.Text; iLength:=Length(myString); // Send pipe message if PipeClient1.Write(mystring[1], iLength) then begin // Flush the pipe buffers PipeClient1.FlushPipeBuffers; end; PipeClient1.Disconnect; end; end; end. MfG Dalai |
AW: Merkwürdiges Verhalten von Named Pipes unter Win7
Hat jemand eine Idee? Ich stell die Frage mal anders: Wer hat bereits erfolgreich Named Pipes benutzt und wie? Gibt's andere Möglichkeiten, Text von einer Anwendung zur anderen zu schicken?
MfG Dalai |
AW: Merkwürdiges Verhalten von Named Pipes unter Win7
Zitat:
Mit Memory Mapped Files sollen auch Java Anwendungen extrem hohe Übertragungsraten zu anderen (auch nicht-Java) Anwendungen erreichen. Andere Möglichkeiten bieten sich mit TCP/IP, entweder mit einem eigenen Protokoll oder einem Standard wie MQTT oder STOMP. Die Auswahl hängt stark von den Rahmenbedingungen ab (soll es sprachunabhängig, betriebssystemunabhängig, zwischen verschiedenen Rechnern einsetzbar sein ...) |
AW: Merkwürdiges Verhalten von Named Pipes unter Win7
Zitat:
Zitat:
Das bedeutet, es wird eine Variante benötigt, die auf einfache Weise in AutoIt zu implementieren ist. Gerade außerhalb der vordefinierten Funktionen wird's da schnell dünn... Funktionen für Named Pipes gibt es, und daher nutze ich diese seit Jahren, bis ich vor einiger Zeit auf das im OP genannte Problem stieß. MfG Dalai |
Update
Faszinierend. Spaßeshalber hab ich die Testanwendung mit XE2 kompiliert und was soll ich sagen: es funktioniert :shock:. Keine Ahnung, ob das an Unicode liegt oder an einem evtl. ungünstig implementierten Verhalten von irgendwas in älteren Delphi-Versionen. Da es mit der Testanwendung funktionierte, hab ich gestern die eigentliche Anwendung ebenfalls mit XE2 verarbeitet und auch diese funktioniert.
Verstehen tue ich das nicht, aber schön, dass ich bei Named Pipes bleiben kann und mir so den Umbau des AutoIt-Client und auch des Servers spare 8-). Dennoch wäre ich dankbar, wenn sich noch jemand meldet, der Named Pipes benutzt und mir sagen kann, wie bzw. womit er/sie die benutzt oder ob das Phänomen nachvollziehbar ist. MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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 by Thomas Breitkreuz