AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WMCopyData in Konsolenanwendung

Ein Thema von CocoPops · begonnen am 2. Apr 2014 · letzter Beitrag vom 2. Apr 2014
Antwort Antwort
CocoPops
(Gast)

n/a Beiträge
 
#1

WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 17:43
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:
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 17:47
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CocoPops
(Gast)

n/a Beiträge
 
#3

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 17:53
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 18:03
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CocoPops
(Gast)

n/a Beiträge
 
#5

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 18:29
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:
 procedure TForm1.cmdNewLine(Sender: TObject; NewLine: string; OutputType: TOutputType); .

Aber bei oben markierter Stelle steigt der Kompiler aus. Die Typen seien nicht kompatibel.

Geändert von CocoPops ( 2. Apr 2014 um 18:33 Uhr)
  Mit Zitat antworten Zitat
CocoPops
(Gast)

n/a Beiträge
 
#6

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 18:43
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#7

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 19:21
Ich selbst nutze die Komponente auch nicht, aber hier steht etwas von SendLine, das klingt doch vielversprechend.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CocoPops
(Gast)

n/a Beiträge
 
#8

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 19:26
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;

Geändert von CocoPops ( 2. Apr 2014 um 19:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 21:05
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: WMCopyData in Konsolenanwendung

  Alt 2. Apr 2014, 21:10
Wenn man eine Konsole hat, wieso nutzt man nicht das, was schon da ist: stdin/stdout....
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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