Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   WMCopyData in Konsolenanwendung (https://www.delphipraxis.net/179796-wmcopydata-konsolenanwendung.html)

CocoPops 2. Apr 2014 16:43

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:
type
 TProcs = class
 private
  procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
 end;
Und schließlich WMCopyData:
Delphi-Quellcode:
procedure TProcs.WMCopyData(var Msg: TWMCopyData);
var
 s: string;
begin
 s := string(PChar(Msg.CopyDataStruct.lpData));

 WriteLn(s);
end;
Das Senden aus dem VCL-Programm heraus sieh so aus und das Fensterhandle der Konsole wird auch gefunden (showmessage):
Delphi-Quellcode:
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;
Es wird erfolgreich SendMessage ausgeführt. Aber ich schaffe es nicht ganz korrekt, diese Message in der Konsole pr WMCopyData-Prozedur aufzufangen.

WO ist der Fehler?

DeddyH 2. Apr 2014 16:47

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.

CocoPops 2. Apr 2014 16:53

AW: WMCopyData in Konsolenanwendung
 
Laut Microsoft bekommt man sogar das Handle eines Konsolenfensters: MSDN-Library durchsuchenSo erhalten Sie eine Konsole Fensterhandle (HWND) (http://support.microsoft.com/kb/124103/de).

Mh, wenn das also nicht das Wahre ist. Wie sendet und empfängt man sonst eine Message (string?) an ein Konsolenfenster?

DeddyH 2. Apr 2014 17:03

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.

CocoPops 2. Apr 2014 17:29

AW: WMCopyData in Konsolenanwendung
 
Sehr interessant diese Unit.

Nur folgendes Problem:
Delphi-Quellcode:
 DosCommand := TDosCommand.Create(nil);
 DosCommand.OnNewLine := DosCommandNewLine; // DosCommandNewLine
Ich habe in der Unit nicht ausfindig machen können, wie man denn die Prozedur für das OnNewLine-Event korrekt deklariert.
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.

CocoPops 2. Apr 2014 17:43

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?

DeddyH 2. Apr 2014 18:21

AW: WMCopyData in Konsolenanwendung
 
Ich selbst nutze die Komponente auch nicht, aber hier steht etwas von SendLine, das klingt doch vielversprechend.

CocoPops 2. Apr 2014 18:26

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;

Luckie 2. Apr 2014 20:05

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.

Bernhard Geyer 2. Apr 2014 20:10

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 15:55 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