Delphi-PRAXiS
Seite 1 von 2  1 2      

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 problem (https://www.delphipraxis.net/80328-sendmessage-problem.html)

Timi-loader 7. Nov 2006 13:10


sendmessage problem
 
hallo

habe nun schon eine menge beispiele gesehen wie man messages von einem zum andere programm sendet, aber irgendwie sind die ja alle ähnlich aufgebaut und funktionieren bei mir nicht. also eine message kommt auch an aber derren inhalt nicht mehr klar.. nur irgendwelches zeichengewirr.

ich habe jetzt soetwas benutzt: http://www.swissdelphicenter.ch/de/showcode.php?id=163

weiß einer wieso mein text nicht klar ankommt?

mfg
timi-loader

Luckie 7. Nov 2006 13:17

Re: sendmessage problem
 
Zitat:

Zitat von Timi-loader
weiß einer wieso mein text nicht klar ankommt?

Lass mich raten.....
Nein warte, ich lege mal eben schnell die Karten......
Nein, Moment, ich hole mal eben meine Glaskugel aus dem Schrank......
Nein, ich könnte noch im Kaffeesatz lesen....

Aber einfacher wäre es bestimmt, wenn du uns verrätst, wie dein Quellcode dazu aussieht.

Timi-loader 7. Nov 2006 13:34

Re: sendmessage problem
 
:stupid: :mrgreen:

also im prinzip hab ich den ja nur vom link oben abgeschreiben.. dachte vllt ist da ja ein genereller bug drinn.. nja hier mal meins:

Delphi-Quellcode:
//Vom Project1:

begin
  hPrevWin := FindWindow(nil, 'BTswitcherHilfe');

  If hPrevWin <> 0 Then
  begin
  txt:='testtext';
  SetForegroundWindow(hPrevWin);
  SendMessage(hPrevWin, WM_USER+77, 0, DWORD(PChar(txt)));
  application.Terminate;
  end
  else
  begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  end;
end.
Delphi-Quellcode:
//oben bei private:
  private
    procedure OnMyMessage(var Msg: TMessage); message WM_USER+77;
Delphi-Quellcode:
//und dann unten:
procedure tform1.OnMyMessage(var Msg: TMessage);
var txt: PChar;
begin
  txt := PChar(msg.lParam);
  msg.Result := 1;
  ShowMessage(txt);
end;
..so das ganze ist eine billige variante zum verhindern des mehrfachstarts und dabei soll dann zur ersten instanz eine message gegeben werden. (später soll die message den paramstr enthalten.. das kommt ja dann noch)

mfg

Luckie 7. Nov 2006 13:42

Re: sendmessage problem
 
Lesen:
Zitat:

Delphi-Quellcode:
{
  This is useful if you want to send a message from your DLL back
  to the calling application.
}

Das ist ein Unterschied, da sich die DLL im gleichen Prozess / Adressraum befindet. Was du willst geht nur mit WM_COPYDATA, da dann Windows dafür sorgt, dass die Zeiger in einen Speicherbereich gemappt werden, in dem der Zeiger für beide Prozesse gültig ist.

Ein Beispiel gibt es hier: http://delphisonstiges.michael-puff.de -> WM_COPYDATA.html

Timi-loader 7. Nov 2006 13:53

Re: sendmessage problem
 
hey cool ;)
thx so gehts!

:thumb:

(p.s.: habs auch ohne record gemacht also einfach die messageart ersetzt - ein string geht jetzt irgendwie nur bis 7 zeichen aber egal das reicht^^)

Luckie 7. Nov 2006 13:57

Re: sendmessage problem
 
Zitat:

Zitat von Timi-loader
ein string geht jetzt irgendwie nur bis 7 zeichen

Hä? Ein Delphi Ansistring kann theoretisch bis zu 2 GB lang werden. Dass du da nur 7 Zeichen übertragen kannst, bedeutet entweder du machst was falsch und es funktioniert nur zufällig oder du hast ein String-Endezeichen an der achten Stelle in deinem String.

Timi-loader 7. Nov 2006 14:52

Re: sendmessage problem
 
hm ja habs wohl nur nen bug ausgenutzt oder so..^^ also es klappt nicht wirklich so wie ichs hab.. mss man wohl mit integer() machen.. also ich hab noch mit diesem pchar gearbeitet gehabt..

kann man den code auch kürzer fassen ohne ein record?.. (ja, aber wie?) also ich komm grad mit dieser datentypumwandlung nicht ganz zurecht

Luckie 7. Nov 2006 14:55

Re: sendmessage problem
 
Zeig doch mal Code. Meine Glaskugel hat gerade der Kollege.

Timi-loader 7. Nov 2006 15:03

Re: sendmessage problem
 
nja mein code bin ich grade wieder neu am verhunzen... -.-
also jetzt wollt ichs eigendlich nur so machen(halt ein string nur):

Delphi-Quellcode:
//sender
  txt:='meinstring';
  cds.dwData := 0;
  cds.cbData := sizeof(txt);
  cds.lpData := @txt;
  SetForegroundWindow(hPrevWin);
  SendMessage(hPrevWin, WM_COPYDATA, 0, Integer(@cds));

//empfänger
procedure tform1.OnMyMessage(var Msg: TWMCopyData);
var txt: string;
begin
  txt := msg.CopyDataStruct.lpData;
  msg.Result := 1;
  ShowMessage('ankommend: '+txt);
end;
aber so geht das ja nicht..
also da hab ich jetzt den durchblick grad nicht.. irgendwas mit pointer ist ja kein string.. :gruebel:

mfg

Christian Seehase 7. Nov 2006 15:29

Re: sendmessage problem
 
Moin Timi,

probier's mal so:

Delphi-Quellcode:
  //...
  cds.cbData := Length(txt); // wenn txt vom Typ String ist, ist SizeOf(txt) = 4
  cds.lpData := @txt[1];    // [1], da ansonsten der Speicher ab der Adresse von txt übertragen wird
  //...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr.
Seite 1 von 2  1 2      

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