![]() |
WieFunktion des Hauptprogrammes über Pointer aus DLLstarten?
Hallo Delphi-Progger!
Die Suchfunktion brachte bislang nur Fragen, aber keine Antworten zu folgendem Problem: ich binde eine DLL dynamisch in mein Hauptprogramm. Nun lese ich bislang meine Daten aus der DLL zyklisch über einen Timer aus. Das ist doof, da Timingprobleme und unnötige Systemauslastung vorliegen. Ich möchte nun meiner DLL die Adresse einer Auslesefunktion meines Hauptprogrammes übergeben:
Delphi-Quellcode:
GetValue ist in diesem Falle eine einfache procedure, die andere Funktionen der DLL aufruft und somit Datensätze aus der DLL liest. Somit würde ich das Abrufen der DLL Funktionen nur noch dann vornehmen, wenn sich wirklich was in der DLL verändert hat (z.B. bei Benutzereingaben)
DLLActivate(@TForm1.GetValue); // DLLActivate(Funktionsadresse:Pointer)
Aber wie kann ich diese Adresse/Pointer nutzen, um meine Funktion im Hauptprogramm aufzurufen? Ich muss ja irgendeine Verbindung zwischen Pointer und einem Funktionsprototyp herstellen, oder? Das sind zwar sicher Basics im Programmieren, aber ich habe irgendwie ein Brett vor dem Kopf. Vielen Dank für jede Hilfe :) Christian! |
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
Oh mann... es ist zum schreien einfach... peinlich...
1. man muss einfach in der DLL die Adresse in einer Variablen vom Typ Pointer speichern 2. in der DLL einen neuen Prototyp deklarieren:
Delphi-Quellcode:
3. irgendeine Funktion der DLL wie folgt aufbauen:
Type TCallback = procedure();stdcall;
Delphi-Quellcode:
procedure TConfig.Button1Click(Sender: TObject);
var Callback:TCallback; begin Callback:=FUNKTIONSADRESSE; Callback(); end; In der Hauptanwendung muss lediglich die Adresse mit einer der DLL Funktionen übergeben werden:
Delphi-Quellcode:
DLL_Funktion(@TForm1.FUNKTION);
es ist manchmal so einfach, dass man nicht darauf kommt. Ich hoffe der Post hilft den Leuten, die wie ich vergeblich in der Delphi-Hilfe gesucht haben :-) Bei einem Post hat der Fragende ne Antwort gefunden, aber nicht hingeschrieben :-/ so long, Christian *g* |
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
Tja, es funktioniert doch noch nicht so super... das übergeben der Adresse mittels Pointer läuft prima und ich kann von der DLL aus die Funktion im Hauptprogramm starten. Nur leider kann ich keine Daten von der DLL mittels Parameter in die Procedure in der Hauptfunktion geben. Was mache ich falsch?
Im Hauptprogramm habe ich meine Funktion so definiert:
Delphi-Quellcode:
ich übergebe der DLL so die Adresse:
procedure CallbackGetDLLNames(nummer:integer; name:PChar);
Delphi-Quellcode:
und das ist sie dann:
DLLFunktion(@TMainform.CallbackGetDLLNames);
Delphi-Quellcode:
In der DLL sieht das ganze jetzt so aus:
procedure TMainform.CallbackGetDLLNames(nummer:integer; name:PChar);
begin ShowMessage(inttostr(nummer)); end; Hier in der DPR-Datei:
Delphi-Quellcode:
und dann in der eigentlichen Form:
procedure DLLFunktion(CallbackGetDLLNames:Pointer);stdcall;
begin @Form1.RefreshDLLNames:=CallbackGetDLLNames; end;
Delphi-Quellcode:
Habe ich irgendwas wichtiges missachtet? Offensichtlich werden die Parameter völlig falsch übertragen, da ich hier nicht die Werte auslese, die gesendet wurden. Vielen Dank für Hilfe jeglicher Art :)
type TCallbackNames = procedure(nummer:integer;name:PChar);
// blablabla CallbackNames:TCallbackNames; // blablabla CallbackNames(15,@beschreibung[15]); //beschreibung[] ist ein string-array |
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
Hi,
was ist das TForm1 bei dir? Eine Klasse oder ein Objekt? Da das "T" am Anfang meistens eine Klasse bezeichnet, nehm ich mal an, dass hier eher Form1 als TForm1 schreiben müsstest, sofern dein Formular irgendwo als
Delphi-Quellcode:
gespeichert ist. Probier's mal aus.
var Form1 : TForm1;
Gruß, Michael |
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
Sorry, da hab ich mich nur hier im Forum verschrieben... ich habe meine Bezeichnungen für besseres Verständnis durch die Standardbezeichnungen ersetzt und da ist mir das "T" dazwischengerutscht.
Das zuweisen der Adresse funktioniert ja auch einwandfrei (habe es mal mit einem ShowMessage() vesucht und in der Hauptanwendung wie auch DLL beides gleiche Adressen). Die DLL ruft ja auch bei einem call der Funktion in der Hauptanwendung ein ShowMessage() in der Funktion auf - also ist die Adressübergabe der Funktion OK. Das Problem liegt offensichtlich wirklich daran, dass ich versuche Werte zu übertragen... ich erhalte nämlich statt eines Integerwertes von z.B. "4" eine irre lange Zahl "4687321546". Also bekommt meine Funktion in der Hauptanwendung die Werte nicht korrekt. Muss ich meiner Hauptanwendung denn auch nochmal irgendwie eine Adresse übergeben, damit ich die mit der Funktion übergebene Werte richtig auslesen kann? |
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
der grund ist das deine procedure im Hauptprogramm keine reine Procedure ist sondern eine Klassenmethode. Wenn es sich um eine globale procedure handeln würde (also eine Procedure welche keine Methode einer klasse wäre) so würde es funktionieren.
|
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
Genial! Ich habe die Callback-Funktion außerhalb von TMainform deklariert und jetzt läufts. Wuah, worauf man alles achten muss.
Ich hab zwar noch ein paar Probleme mit dem String/PChar, aber das lässt sich sicher gleich lösen... da habe ich irgendwas beim wandeln von String->PChar nicht beachtet. Die Integer-Werte werden korrekt übertragen und das ist die Hauptsache. Vielen Dank für die schnelle Hilfe! Jetzt kann ich endlich weiterprogrammieren... *g* |
Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar
Moin Christian,
um Jens' Aussage noch etwas zu ergänzen: Eine Klassenmethode hat immer noch einen impliziten Parameter, nämlich self. Beispielsweise sieht die Deklaration von
Delphi-Quellcode:
so aus:
procedure Button1Click(Sender: TObject);
Delphi-Quellcode:
procedure Button1Click(self: TKlassenname;Sender: TObject);
// konkret procedure Button1Click(self: TForm1;Sender: TObject); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 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