Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WM_CopyData Problem (https://www.delphipraxis.net/137458-wm_copydata-problem.html)

aaaaaaaaaa_10 21. Jul 2009 10:43


WM_CopyData Problem
 
Hallo,
ich will die Kennung eines Programms zu einem anderen schicken :
Delphi-Quellcode:
with aCopyData do begin
      dwData := 0;
      cbData := StrLen(pChar(vParam.Kennung)) + 1;
      lpData := pChar(vParam.Kennung);
    end;
  SendMessage(FindWindow('DKomMainWnd', nil), WM_COPYDATA, Longint(Handle),
              Longint(@aCopyData));

Jetzt kommt aber der Fehler : Undefinierter Bezeichner : 'Handle', aber ich habe doch meiner Meinung nach alle units eingebunden?!

[delphi]uses Classes, DGlobals, Contnrs, ExtCtrls, DTplFrameFktTyp, Dialogs, Messages,
Controls, SysUtils, DateUtils, Math, Windows, Forms;

Was läuft da verkehrt?

Bernhard Geyer 21. Jul 2009 10:45

Re: WM_CopyData Problem
 
"Handle" ist ein Property der Klasse TForm. Wenn du nun das nicht als Methode des Formulars implementiert hast, hast du auch kein entsprechendes Property

hoika 21. Jul 2009 10:46

Re: WM_CopyData Problem
 
Hallo,

mit Handle ist dein eigenes Programm gemeint.
Übergib das Handle deines Haupt-Forms,
also z.B. Form1.Handle.

zu langsam ;(


Heiko

aaaaaaaaaa_10 21. Jul 2009 10:47

Re: WM_CopyData Problem
 
Oh, aber ich habe kein Formular. Wie kann ich denn sonst einen String an ein anderes Programm senden?

Luckie 21. Jul 2009 10:48

Re: WM_CopyData Problem
 
Du hast kein Formular? Es ist also eine Konsolenanwendung?

Beim Absender kannst du wahrscheinlich auch 0 angeben.

DeddyH 21. Jul 2009 10:50

Re: WM_CopyData Problem
 
Wenn Du nur senden und nicht empfangen willst, sollte statt des Handles eine 0 genügen, denke ich mal.

[edit] Wo war der rote Kasten? [/edit]

himitsu 21. Jul 2009 10:52

Re: WM_CopyData Problem
 
Hier im Forum suchenMessageOnlyWindows/MSDN-Library durchsuchenMessageOnlyWindows
oder das intene (unsichtbare) Fenster von Application nutzen

aaaaaaaaaa_10 21. Jul 2009 10:53

Re: WM_CopyData Problem
 
Na ich möchte einen String senden und diesen in einem anderen Programm empfangen.

hoika 21. Jul 2009 10:54

Re: WM_CopyData Problem
 
Hallo,

also übergib eine 0 oder Application.Handle.
Das ist Wurscht.


Heiko

Alaitoc 21. Jul 2009 10:54

Re: WM_CopyData Problem
 
Also ich würde das jetzt aus dem Kopf so machen:

Delphi-Quellcode:
SendMessage(FindWindow('DKomMainWnd', nil), WM_COPYDATA, Longint(@aCopyData),0);
zumindest funktioniert es via Postmessage ein Objekt zu "versenden" und das verlangt
die gleichen Parameter:

Delphi-Quellcode:
PostMessage(m_lwWndHandle, WM_FREE_QUERY, Integer(coQuery), 0);
MfG Alaitoc

aaaaaaaaaa_10 21. Jul 2009 11:01

Re: WM_CopyData Problem
 
Habe es wie folgt gemacht und es erscheint ersteinmal kein Fehler mehr.

Delphi-Quellcode:
  SendMessage(FindWindow('DKomMainWnd', nil), WM_COPYDATA, 0, Longint(@aCopyData));
Mal sehen wie es sich mit dem Empfangen verhält.

Luckie 21. Jul 2009 11:10

Re: WM_CopyData Problem
 
Zitat:

Zitat von Alaitoc
zumindest funktioniert es via Postmessage ein Objekt zu "versenden" und das verlangt

Die Parameter sind abhängig von der Nachricht und nicht von der API Funktion, die genutzt wird.

aaaaaaaaaa_10 21. Jul 2009 11:13

Re: WM_CopyData Problem
 
Hab die Procedure jetzt in die Form des EmpfangsProgramms eingebunden :

Delphi-Quellcode:
 TKomMainWnd = class(TForm)
    ...
 procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
...

Delphi-Quellcode:
procedure TKomMainWnd.WMCopyData(var Msg: TWMCopyData);
begin
  oldi := String(PChar(Msg.CopyDataStruct.lpData));
end;
Wenn ich jetzt aber unter
Delphi-Quellcode:
procedure TKomMainWnd.FormCreate(Sender: TObject);
ShowMessage(oldi) ausführen will, wird mir nur ein leeres Fenster gezeigt.

Was mache ich verkehrt?

himitsu 21. Jul 2009 11:22

Re: WM_CopyData Problem
 
vermutlich, weil in FormCreate noch keine WM_COPYDATA-Nachricht empfangen wurde?

Luckie 21. Jul 2009 11:25

Re: WM_CopyData Problem
 
Überlegen wir mal: Ich stelle den Stuhl ins Wohnzimmer und wundere mich dann, warum ich mich im Schlafzimmer nicht draufsetzen kann.
FormCreate ist die erste Methode, die aufgerufen wird, wenn das Formular erzeugt wird. Zu dem Zeitpunkt, wirst du noch keine WM_COPYDATA Nachricht empfangen haben. Desweiteren kommen die Daten eben in der Methode TKomMainWnd.WMCopyData an und nicht in FormCreate.

aaaaaaaaaa_10 21. Jul 2009 11:31

Re: WM_CopyData Problem
 
Zitat:

vermutlich, weil in FormCreate noch keine WM_COPYDATA-Nachricht empfangen wurde?
WIe empfange ich denn dadrin eine Nachricht?

Luckie 21. Jul 2009 11:43

Re: WM_CopyData Problem
 
Ich glaube, du hast gar nichts verstanden. Rat mal, warum du beim Empfänger die Methode procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; hast? Nämlich um dort die Daten zu empfangen die an dein Fenster mit WM_COPYDATA geschickt wurden. So, wo sind jetzt die geschickten Daten in deinem Quellcode verfügbar?

Medium 21. Jul 2009 11:47

Re: WM_CopyData Problem
 
Hier scheint auch wieder mal ganz dringend ein Hinweis auf die netten Hier im Forum suchenGrundlagen Tutorials fällig zu sein. Aus deinen bisherigen Fragen erkennt man, dass du noch sehr frisch dabei sein dürftest und es oftmals schon am kennen/verstehen von einfachen Prinzipien mangelt. Bevor das nicht vorhanden ist wirst du für jeden Pup hier auflaufen müssen, und das hält dich nur unnötig auf.

hoika 21. Jul 2009 12:03

Re: WM_CopyData Problem
 
Hallo,

zur Erklärung.
Im FormCreate existiert das Windows-Fenster noch nicht,
sondern erst das TForm (was NICHT das Windows-Fenster ist)

Die früheste Stelle ist FormActivate oder FormShow.

Im FormCreate geht das über memory mapped files,
was ich mir aber nicht antun würde.


Heiko

himitsu 21. Jul 2009 13:23

Re: WM_CopyData Problem
 
in FormCreate existiert es schon, aber kurz davor existierte es noch nicht
zwischendurch werden standardmäßig auch keine Messages abgearbeitet
und demnach kann ein WM_COPYDATA an diese Form da noch nicht verarbeitet sein.

- wurde WM_COPYDATA vorm Create abgesendet, ging diese Nachricht ins Nichts, da das Zielfenster noch nicht existierte
- und selbst wenn die Nachricht in der Millisekunde (oder auch ein bissl länger) versendet, wärend das Erstellen der Form begann und OnCreate aufgerufen wurde, dann wird diese Nachricht erst verarbeitet, wenn das Programm später mal die eingegangenen Nachrichten abarbeitet


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 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