![]() |
WMCopyData in Konsolenanwendung
Gemeinde.
Ich probiere mich momentan ein wenig mit Konsolenanwendungen und WMCopyData herum. Ich nutzte WMCopyData schon sehr sehr häufig zwischen zwei VCL-Programmen und es funktioniert super. Aber VCL > Konsole, das will nicht so wie ich gerne hätte. Ich gehe so vor. Ich ändere im Konsolenprogramm den Fenstertitel:
Delphi-Quellcode:
SetConsoleTitle(PWideChar('TTestWindow'));
Dann erstelle ich mir eine kleine Klasse im Konsolenprogramm:
Delphi-Quellcode:
Und schließlich WMCopyData:
type
TProcs = class private procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; end;
Delphi-Quellcode:
Das Senden aus dem VCL-Programm heraus sieh so aus und das Fensterhandle der Konsole wird auch gefunden (showmessage):
procedure TProcs.WMCopyData(var Msg: TWMCopyData);
var s: string; begin s := string(PChar(Msg.CopyDataStruct.lpData)); WriteLn(s); end;
Delphi-Quellcode:
Es wird erfolgreich SendMessage ausgeführt. Aber ich schaffe es nicht ganz korrekt, diese Message in der Konsole pr WMCopyData-Prozedur aufzufangen.
var
hExisting: THandle; pName: PChar; aCopyData: TCopyDataStruct; begin hExisting := FindWindow(nil, 'TTestWindow'); if hExisting <> 0 then begin showmessage('TTest wurde gefunden!'); with aCopyData do begin pName := PWideChar('Hallo Konsole!'); dwData := 0; cbData := (StrLen(pName) + 1) * SizeOf(Char); lpData := pName; end; SendMessage(hExisting, WM_COPYDATA, 0, LongInt(@aCopyData)); end; WO ist der Fehler? |
AW: WMCopyData in Konsolenanwendung
Kann eine Konsolenanwendung denn überhaupt Zugriff auf das Konsolenfenster bekommen, in dem sie läuft? Es wäre vielleicht einfacher, ein MessageOnly-Fenster innerhalb der Anwendung zu erzeugen, aber das ist nur so ein spontaner Gedanke.
|
AW: WMCopyData in Konsolenanwendung
Laut Microsoft bekommt man sogar das Handle eines Konsolenfensters:
![]() ![]() Mh, wenn das also nicht das Wahre ist. Wie sendet und empfängt man sonst eine Message (string?) an ein Konsolenfenster? |
AW: WMCopyData in Konsolenanwendung
Es gibt da eine Komponente (neueste Version IIRC von sirius bearbeitet) namens TDOSCommand, damit müsste es gehen. Die Kommunikation läuft dort über Pipes.
|
AW: WMCopyData in Konsolenanwendung
Sehr interessant diese Unit.
Nur folgendes Problem:
Delphi-Quellcode:
Ich habe in der Unit nicht ausfindig machen können, wie man denn die Prozedur für das OnNewLine-Event korrekt deklariert.
DosCommand := TDosCommand.Create(nil);
DosCommand.OnNewLine := DosCommandNewLine; // DosCommandNewLine Ich habe Sie so deklariert:
Delphi-Quellcode:
.
procedure TForm1.cmdNewLine(Sender: TObject; NewLine: string; OutputType: TOutputType);
Aber bei oben markierter Stelle steigt der Kompiler aus. Die Typen seien nicht kompatibel. |
AW: WMCopyData in Konsolenanwendung
Ne also mit TDosCommand komme ich gar nicht klar.
Ich glaube das ist viel zu over-sized für mein kleines Problem. Wie sende ich den ganz einfach nur einen String von der GUI mit TDosCommand zur Konsole? |
AW: WMCopyData in Konsolenanwendung
Ich selbst nutze die Komponente auch nicht, aber
![]() |
AW: WMCopyData in Konsolenanwendung
Das habe ich bereits probiert. Aber er meckert bei der Zeile die CommandLine enthält. Was muss denn da eigentlich hin? Bleibt da immer stur 'cmd' stehen?
Und falls nicht, was ist CommandLine und was ist SendLine? Und was ich auch noch nicht verstanden habe ist, wo man denn wie festlegt wer mit dem kommuniziert. Aber zum Problem mit WM_CopyData: das Versenden funktioniert sehr gut und das Handle des Konsolenfensters wird auch gefunden (über den Fenstertitel). Aber ich schaffe es nicht, die Daten zu empfangen und demnach wird niemals ein X auf die Konsole geschrieben:
Delphi-Quellcode:
procedure TProcs.WMCopyData(var Msg: TWMCopyData);
begin WriteLn('X'); end; |
AW: WMCopyData in Konsolenanwendung
WMCopyData kann nicht funktionieren. Ein Konsolenprogramm hat kein Fenster. Ein Konsolenprogramm läuft in der Konsole und nicht in einem Fenster. WMCopyData kann man aber nur an Fenster schicken.
|
AW: WMCopyData in Konsolenanwendung
Wenn man eine Konsole hat, wieso nutzt man nicht das, was schon da ist: stdin/stdout....
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 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