![]() |
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:
und jetzt vom empfänger (im prog):
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;
Code:
Wo liegt da jetzt der Fehler :?: Ich habe auch schon bei google gesucht aber leider nichts brauchbares gefunden.
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; cu, moin339 :( :coder: |
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? |
Zitat:
Oder hast du noch eine Andere Möglichkeit parat? cu, moin339 :coder: |
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? |
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; |
Moin!
Zitat:
Zitat:
Zitat:
viel Spaß noch beim programieren :coder:, moin339 |
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; |
ok danke für deine schnelle hilfe
|
Moin!
Ich bin's noch mal Zitat:
Delphi-Quellcode:
funktioniert bei mir auch. Ist da irgentwo ein Nachteil?
Test.s := s
ciao, moin339 |
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 12:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz