AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi record von einer dll an ein programm schicken
Thema durchsuchen
Ansicht
Themen-Optionen

record von einer dll an ein programm schicken

Ein Thema von moin339 · begonnen am 12. Dez 2002 · letzter Beitrag vom 13. Dez 2002
Antwort Antwort
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#1

record von einer dll an ein programm schicken

  Alt 12. Dez 2002, 15:54
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.107 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 12. Dez 2002, 17:45
Moin Moin

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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#3
  Alt 12. Dez 2002, 17:52
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.107 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5
  Alt 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;
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#6
  Alt 12. Dez 2002, 21:20
Moin!

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 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


Zitat von jbg:
Verwende also lieber ShortString oder String[x]
Danke jetzt funktioniert alles , ich würd aber trotzdem noch gerne wissen wie hoch x sein kann. Höher als 255?

viel Spaß noch beim programieren , moin339
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 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;
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#8
  Alt 12. Dez 2002, 21:45
ok danke für deine schnelle hilfe
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#9
  Alt 13. Dez 2002, 18:11
Moin!

Ich bin's noch mal

Zitat von jbg:
StrLCopy(Test.s, PChar(s), 1024); // s in Test.s kopieren
Warum kann man das nicht so machen:
Test.s := s funktioniert bei mir auch. Ist da irgentwo ein Nachteil?

ciao, moin339
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#10
  Alt 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.
  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 23:05 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