Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Sendmessage pointer of array (https://www.delphipraxis.net/58031-sendmessage-pointer-array.html)

th_bone 30. Nov 2005 12:13


Sendmessage pointer of array
 
Hi,

eine kurze frage ich will mit sendmessage einen pointer auf ein array versenden

Delphi-Quellcode:
 type
  Mymessage = record
    msgtext: String[20];
    msgint : integer;
  end;

 //....

 var
  mymsg: mymessage;

 //....

procedure TForm1.FormCreate(Sender: TObject);
begin
  mymsg.msgtext:='test';
  mymsg.msgint:=1234;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST, WM_OURMESSAGE, Handle, integer(@mymsg));
end;
aber wie bekomme ich den jetzt wieder zugriff auf die arraystruktur ?

bei einem string funktiniert es ja ala

Delphi-Quellcode:
text := string(pchar((pointer(Msg.Info))));
aber wie greife ich auf einen wert im array zu ? :freak:

Danke

Ralf

alzaimar 30. Nov 2005 12:21

Re: Sendmessage pointer of array
 
Normalerweise verschickt man sowas doch mit WM_COPYDATA. Du bist Dir sicher, das Deine Version funktioniert? Normalerweise kann ich doch nicht als fremdes Handle in deinen Adressbereich rein... Na egal, ich verwende WM_COPYDATA.

th_bone 30. Nov 2005 13:04

Re: Sendmessage pointer of array
 
Hi,

ja funktioniert gut - ich finde das ist eine schöne möglichkeit variablen zwischen meinen
Programmen auszutauschen

einfach eine form mit einem label + button code hineinkopieren und 2x das Prog starten..

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

{ Basiert auf CodeSnippet [url]http://www.swissdelphicenter.ch/de/showcode.php?id=418[/url] }

type
  TWMMYMessage = record
    Msg: Cardinal;  // ( first is the message ID )
    Handle: HWND;   // ( this is the wParam, Handle of sender)
    Info: Longint;  // ( this is lParam, pointer to our data)
    Result: Longint;
  end;

  Mymessage = record
    msgtext: String[20];
    msgint : integer;
  end;

  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure DefaultHandler(var Message); override;
    procedure WMMYMessage(var Msg: TWMMYMessage);
  end;

var
  Form1: TForm1;
  WM_OURMESSAGE: DWORD;
  mymsg: mymessage;
  strtest : string[30];

implementation

{$R *.dfm}

procedure TForm1.DefaultHandler(var Message);
var
  ee: TWMMYMessage;
begin
  with TMessage(Message) do
  begin
    if (Msg = WM_OURMESSAGE) then
    begin
      ee.Msg   := Msg;
      ee.Handle := wParam;
      ee.Info  := lParam;
      // Checking if this message is not from us
     if ee.Handle <> Handle then
        WMMYMessage(ee);
    end
    else
      inherited DefaultHandler(Message);
  end;
end;

procedure TForm1.WMMYMessage(var Msg: TWMMYMessage);
var
 text: string;
begin
  text:=string(pchar(pointer(Msg.Info)));
  delete(text,1,1);
  Label1.Caption := text;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(HWND_BROADCAST, WM_OURMESSAGE, Handle, integer(@strtest));
  //SendMessage(HWND_BROADCAST, WM_OURMESSAGE, Handle, integer(@mymsg));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 mymsg.msgtext:='test';
 mymsg.msgint:=1234;
 strtest:='strtest';
end;

initialization
  WM_OURMESSAGE := RegisterWindowMessage('broadcast message');

end.

Luckie 30. Nov 2005 13:08

Re: Sendmessage pointer of array
 
Zitat:

Zitat von th_bone
ja funktioniert gut

Ich dachte es funktioniert eben gerade nicht. :gruebel:

Der Pointer hat im Adressraum des anderen Prozesses keine Gültigkleit. Du wirst schon WM_COPYDATA benutzen müssen, wen du es so machen willst. Eine Alternative wären Memory Mapped Files oder Named Pipes.


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