AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Pointer auf Record in eigener Windows Message übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer auf Record in eigener Windows Message übergeben

Offene Frage von "sieppl"
Ein Thema von sieppl · begonnen am 6. Dez 2004 · letzter Beitrag vom 27. Apr 2005
Antwort Antwort
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#1

Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 18:29
Hi,

ich habe folgendes Problem:

Delphi-Quellcode:
  TDeviceInfo = packed record
    Vol: Shortstring;
    GUID: Shortstring;
    Event: UINT;
  end;
  PDeviceInfo = ^TDeviceInfo;

//wird hier eingepackt:

FillMemory(@TransferDeviceInfo, Sizeof(TransferDeviceInfo), 0);
TransferDeviceInfo.Event := DBT_DeviceArrival;
TransferDeviceInfo.GUID := DeviceInfo.GUID; //hier sind die Werte noch korrekt!!
TransferDeviceInfo.Vol := DeviceInfo.Vol;

//und losgeschickt:
PostMessage(AWnd, WM_SOURCEFOUND, CCamera, Integer(@TransferDeviceInfo));

//eine andere App emfängt es:

procedure TDevCheckHandler.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;
  case Msg.message of
    WM_SOURCEFOUND:
    begin
      FDeviceInfo.Event := PDeviceInfo(Msg.lParam).Event;
      if Msg.wParam = CVolume then
        FDeviceInfo.Vol := PDeviceInfo(Msg.lParam).Vol;
      if Msg.wParam = CCamera then
        FDeviceInfo.Guid := PDeviceInfo(Msg.lParam).GUID;
      if Assigned(FOnDevChange) then
        FOnDevChange;
      Handled := True;
    end;
    WM_PASSHANDLE:
    begin
      FDevCheckHandle := Msg.wParam;
      Handled := True;
    end;
  end;
end;
es kommt leider nur schrott an. Der wParam wird korrekt erkannt, es handelt
sich also um die richtige Nachricht. Ich vermute, ich habe die Pointer
versaut. Sieht jemand den Fehler? Probiere schon seit einer Stunde herum.

Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 18:35
ganz einfach. Ein Pointer ist ein Cardinal (also es gibt keine negativwerte).
zum verschicken castest du das ganze auf Integer
... Integer(@TransferDeviceInfo) ... und wenn du die Message dann nutzt
PDeviceInfo(Msg.lParam).Event castest du "Msg.lParam" nicht zurück zu Cardinal/Pointer
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#3

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 18:58
Ich denke ehr, das Problem liegt darin, dass jede Anwendung ihren eigenen Adressraum besitzen. Wenn du also eine Adresse von Anwendung a an Anwendung b übergibst. Dann steht an der Adresse in Anwendung b etwas anderes.

Ich weiss jetzt leider nicht wie, aber du musst Prozessübergeifenden Speicher erstellen. Irgendwie funktioniert das mit MSDN-Library durchsuchenFile Mapping frag aber bitte nicht wie. Eventuell kannst du auch GlobalAddAtom nutzen, damit können aber nur Strings (dürfen nicht $00 enthalten) übertragen werden.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 19:02
Der Grund warums nicht geht:

Die veschickst in einer Funktion einen Pointer auf eine Variable, die auf dem Stack liegt.

Da du mit PostMessage (asychron) arbeitest wird die Funktion aber verlassen und damit deine Stack Inhalt ungöltig, bevor die Message Schleife mit HAndle Message aufgerufen wird!

DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#5

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 19:05
Richtig ist auch, das du keine Daten von einer App in eine andere App schicken kannst. bzw einen Poiter darauf.

Dazu gibts unter Windows die Msg WM_COPYDATA.

Such mal danach!

DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#6

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 19:59
Hi!

Vielen Dank für die Antworten. Sehr einleuchtend. Irgendwie bin
ich auf den komischen Gedanken gekommen, dass ich mit FillMem
Speicher im Heap alloziere.

Danke, ich werde Eure Tipps mal checken.

Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 6. Dez 2004, 20:07
Tust du vielleicht auch, nur eben im gleichen Prozess.

PS: Es geht übrigens nur mit WM_COPYDATA, da Windows für diese spezielle Nachricht den Speicher entsprechend mapped, so dass andere Prozesse darauf zugreifen können. Ein Beispiel gibt es hier: http://www.luckie-online.de/Delphi/Sonstiges/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sieppl
sieppl

Registriert seit: 15. Aug 2004
Ort: Münster
198 Beiträge
 
Delphi 7 Professional
 
#8

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 7. Dez 2004, 11:47
Hi nochmal,

gibt es irgendwelche bekannten Einschränkungen, wenn ich WM_COPYDATA direkt
an die Applikation schicke und diese Messages dann in OnMessage behandelt werden?
Ich habe mich ziemlich genau an die verfügbaren Beispiele gehalten, die WM_COPYDATA
kommt einfach nicht an.

Delphi-Quellcode:
//Hier der Sender:
SendMessage(TargetAppHandle, WM_COPYDATA, AWnd, Integer(@CopyDataStruct));

//Der Empfänger:

Application.OnMessage := DevCheckHandler.AppMessage; (vorher natürlich initialisiert)

procedure TDevCheckHandler.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;
  case Msg.message of
    WM_COPYDATA:
    begin
      FDeviceInfo.Event := PDeviceInfo(PCopyDataStruct(Msg.lParam).lpData).Event;
      if Msg.wParam = CVolume then
        FDeviceInfo.Vol := PDeviceInfo(PCopyDataStruct(Msg.lParam).lpData).Vol;
      if Msg.wParam = CCamera then
        FDeviceInfo.Guid := PDeviceInfo(PCopyDataStruct(Msg.lParam).lpData).GUID;
      if Assigned(FOnDevChange) then
        FOnDevChange;
      Handled := True;
    end;
    WM_PASSHANDLE: //der kommt immer an!
    begin
      FDevCheckHandle := Msg.wParam;
      Handled := True;
    end;
  end;
end;

//mit
PostMessage(TargetAppHandle, WM_PASSHANDLE, AWnd, 0);
//und
procedure TDevCheckHandler.PassAppHandle;
begin
  PostMessage(FDevCheckHandle, WM_PASSHANDLE, FAppHandle, 0);
end;
//kann ich zwischen beiden die Handles hin und her übergeben
// -> Die Kommunikation steht in Grunde
nochmal: WM_COPYData wird definitiv losgeschickt (bin mit dem Debugger) durch, beim Empfänger tut sich GARNICHTS. Ich bin mit meinem Latein am Ende.

Grüße

Sebastian
Sebastian
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#9

Re: Pointer auf Record in eigener Windows Message übergeben

  Alt 27. Apr 2005, 19:18
Die meisten Handles sind nur im eigenen Prozess gültig. Selbst bei Kindprozessen muß man extra angeben, ob die Handles vererbt werden dürfen.
  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 20:52 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