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 record von einer dll an ein programm schicken (https://www.delphipraxis.net/1601-record-von-einer-dll-ein-programm-schicken.html)

moin339 12. Dez 2002 15:54


record von einer dll an ein programm schicken
 
Moin!

Ich bin grad dabei ein record von einer dll an ein Programm zu Schicken. Ich wollte das mit der Message WM_COPYDATA machen aber es funktioniert leider nur, wenn mein Programm im Vordergrund ist. Wisst ihr wodran das liegt?

Hier jetzt erstmal der Code des Senders (in der dll):
Code:
procedure Sende;
type
  TTest = record
    s: string;
    i: integer;
  end;

var
  CDS: TCopyDataStruct;
  Test: TTest;
  lPTest: ^TTest;
begin
  lPTest := @Test;
  lPTest^.s := 'Hallo! Ist das angekommen?';
  lPTest^.i := 4564;
  with CDS do
  begin
    dwData := 0;
    cbData := SizeOf(Test) + 1;
    lpData := lPTest;
  end;
  SendMessage(ProgHandle^, WM_COPYDATA, 0, LongInt(@CDS));
end;
und jetzt vom empfänger (im prog):
Code:
procedure TForm1.Empfange(var msg: TWMCopyData);
type
  TTest = record
    s: string;
    i: integer;
  end;
var
 Test: TTest;
 lPTest: ^TTest;
begin
  lPTest := msg.CopyDataStruct.lpData;
  Test := lpTest^;

  showmsg('übergebener String:' + #13 + Test.s);
  showmsg('übergebene Zahl:' + #13 + IntToStr(Test.i));
end;
Wo liegt da jetzt der Fehler :?: Ich habe auch schon bei google gesucht aber leider nichts brauchbares gefunden.

cu, moin339 :( :coder:

Christian Seehase 12. Dez 2002 17:45

Moin Moin :mrgreen:

wenn die DLL von dem Programm geladen wird, dass mittels WM_COPYDATA die Daten empfangen soll hätte ich so eine Idee.

Diese Message dient zum Austausch von Daten zwischen verschiedenen Prozessen. Wenn die DLL aber von dem Programm geladen wurde, befindet sie sich im gleichen Adressraum (logisch zumindest) gehört zum gleichen Prozess und wird deshalb wohl nicht aktiv.

Das ist jetzt nur eine "Schnellschussidee", von der ich nicht genau weiss, ob's stimmt.

Abers...
Was hast Du denn genau vor?

moin339 12. Dez 2002 17:52

Zitat:

Zitat von Christian Seehase
Was hast Du denn genau vor?

Wie du schon gesagt hast: Ich möchte Daten von der Dll an das Programm schicken. In der dll ist ein globaler hook der eine Tastenkombination registrieren soll die im prog verarbeitet wird. Wodran kann es aber liegen, dass mein Beispiel nur funktioniert, wenn mein prog im Vordergrund ist?

Oder hast du noch eine Andere Möglichkeit parat?

cu, moin339 :coder:

Christian Seehase 12. Dez 2002 18:46

Moin Moin,

so ganz hab' ich's eventuell jetzt nicht verstanden, aber kommt für Dich nicht vielleicht die API Funktion RegisterHotkey in Frage?

Oder ist die DLL eine Hook DLL, die Du mit SetWindowsHookEx registrierst?

jbg 12. Dez 2002 19:04

Also den String im Record würde ich nochmal genau anschauen. Ein String ist nur ein Zeiger auf die eigentlichen Stringdaten. Wm_COPYDATA kopiert also nur den String. Aber der Zeigt in einem anderen Prozess nicht auf die eigentlichen Zeichen. Verwende also lieber ShortString oder String[x]
Delphi-Quellcode:
TTest = record
  s: string[255]; // = ShortString
  i: integer;
end;

moin339 12. Dez 2002 21:20

Moin!

Zitat:

Zitat von Christian Seehase
Oder ist die DLL eine Hook DLL, die Du mit SetWindowsHookEx registrierst?

Genau das ist Sie. RegisterHotkey ist leider nicht so gut dafür geeignet.

Zitat:

Zitat von jbg
Ein String ist nur ein Zeiger auf die eigentlichen Stringdaten.

Ich dachte im String wären die daten enthalten und PChar wäre ein zeiger. Naja du wirst schon recht haben :freak:


Zitat:

Zitat von jbg
Verwende also lieber ShortString oder String[x]

Danke jetzt funktioniert alles :spin: , ich würd aber trotzdem noch gerne wissen wie hoch x sein kann. Höher als 255?

viel Spaß noch beim programieren :coder:, moin339

jbg 12. Dez 2002 21:36

x kann höchstens 255 sein.
Du kannst es aber dadurch erhöhen, dass du ein Array[0..x] of Char benutzt:
Delphi-Quellcode:
TTest = record
  s: array[0..1024] of Char;
  i: integer;
end;

var
  Test: TTest;
  s: string;
begin
  s := 'Hallo';
  StrLCopy(Test.s, PChar(s), 1024); // s in Test.s kopieren
end;
..
begin
  s := PChar(test.s); // und wieder auslesen
end;

moin339 12. Dez 2002 21:45

ok danke für deine schnelle hilfe

moin339 13. Dez 2002 18:11

Moin!

Ich bin's noch mal

Zitat:

Zitat von jbg
Delphi-Quellcode:
StrLCopy(Test.s, PChar(s), 1024); // s in Test.s kopieren

Warum kann man das nicht so machen:
Delphi-Quellcode:
Test.s := s
funktioniert bei mir auch. Ist da irgentwo ein Nachteil?

ciao, moin339

jbg 13. Dez 2002 19:37

Solange in S nicht mehr als 1024 Zeichen drin sind, gibt es keine Probleme. StrLCopy hört halt nach 1024 Zeichen auf alle Fälle auf.


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