AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Daten per Message übertragen (WM_COPYDATA?)
Thema durchsuchen
Ansicht
Themen-Optionen

Daten per Message übertragen (WM_COPYDATA?)

Ein Thema von DGL-luke · begonnen am 6. Jul 2006 · letzter Beitrag vom 8. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 15:52
Hallo,

bin hier gerade munter am Proggen und weiß noch nicht mal, ob das so funktioniert, wie ich meine.

Ich versende Nachrichten, die einen Pointer auf ein bei mir liegendes struct (record) enthalten. kann das programm, das den Pointer empfängt, auf die Daten an der adresse zugreifen? Bzw. passiert bei WM_COPYDATA irgendetwas spezielles? Ich habe jetzt selbst definierte Nachrichten im Stil von WM_USER + xxx.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#2

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 15:54
Ja, das andere Programm kann auf den Speicher zugreifen.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 15:55
WM_COPYDATA sorgt dafür, dass der Zeiger seine gültigkeit behält im fremden Prozess. Mit selbst definierten Nachrichten wird es nicht gehen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 15:57
aha... das sind jetzt zwei widersprüchliche informationen... oder bezieht sich deine aussage nur auf WM_COPYDATA, ste_ett?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#5

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 16:03
Zitat von DGL-luke:
aha... das sind jetzt zwei widersprüchliche informationen... oder bezieht sich deine aussage nur auf WM_COPYDATA, ste_ett?
Die COPYDATA-Struktur beinhaltet einen Pointer auf eine Struktur, für die du Speicher geholt hast.
Diesen Pointer bekommt die Anwendung, an die du diese Fensternachricht schickst und kann dann darauf zugreifen.
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 16:31
ok, danke.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 19:46
SO, eine Frage hätt ich da noch: Bring ich ohne unschöne Trickserei (immerhin gibt es ja CopyDataStruct.cbData ) einen string/PChar/array of char von beliebiger Länge in das Struct? Es geht hier konkret um einen dateinamen, den könnt ich natürlcih kurz halten, aber unbegrenzt wär schon schöner... Ich nehme mal an, ein PChar in meinem record würd irgendwo in meinen Adressraum zeigen, und der Zielapp nix anderes als AVs bescheren...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 20:57
Moin Lukas,

schau Dir mal das letzte Element der Struktur an.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 20:59
ja klar, das ist ein pointer auf die daten, die ich übertragen will.

ich will aber einen record übertragen und in diesem record wiederum einen string. ohne größenbeschränkung wie z.B. string[255] oder array[0..1023] of char.

EDIT: Ich könnte da natürlich ganz frech hergehen und mit Getmem und copy arbeiten, aber das will ich eigentlich nicht. genauso empfände ich es als unschön, zwei messages, eine mit den primitiven informationen und eine mit dem string zu senden.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Daten per Message übertragen (WM_COPYDATA?)

  Alt 6. Jul 2006, 21:13
Zitat von DGL-luke:
SO, eine Frage hätt ich da noch: Bring ich ohne unschöne Trickserei (immerhin gibt es ja CopyDataStruct.cbData ) einen string/PChar/array of char von beliebiger Länge in das Struct?
Die dabei mögliche Länge scheint nicht limitiert zu sein. In einem kleinen WM_CopyData-TestProg jedenfalls konnte ich seinerzeit locker den Inhalt eines TMemoryStreams versenden bzw. empfangen. Im Detail war das dann wieder der Inhalt eines RichEdit-Controls mit eben auch durchaus mehr als 255 (etc.) Characters:


Delphi-Quellcode:
// Sende-Proc in einem "Prog A"
procedure TForm1.SendTextViaWMCopyData(Sender: TObject);
var AStream : TMemoryStream;
    ACopyDataStruct : TCopyDataStruct;
begin
  AStream := TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(AStream);

  with ACopyDataStruct do begin
    dwData := 0;
    cbData := AStream.Size;
    lpData := AStream.Memory;
  end;

  SendMessage(FindWindow(Nil,'Prog B'), WM_CopyData, Handle, integer(@ACopyDataStruct));
  AStream.Free;
end;


// Empfangs-Proc in einem "Prog B"
procedure TForm1.GetTextViaWMCopyData(var AMsg : TMessage);
type PCopyDataStruct = ^TCopyDataStruct;
var AStream : TMemoryStream;
begin
  AStream := TMemoryStream.Create;
  AStream.Write(PCopyDataStruct(AMsg.LParam).lpData^,PCopyDataStruct(AMsg.LParam).cbData);
  AStream.Position := 0;
  RichEdit2.Lines.LoadFromStream(AStream);
  AStream.Free;
end;
edit: die Empfangs-Proc ist natürlich eine Botschaftsbehandlungsroutine für WM_COPYDATA-Messages (die also auch entsprechend im Deklarationsteil der Form so zu deklarieren ist).
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:06 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