AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WieFunktion des Hauptprogrammes über Pointer aus DLLstarten?
Thema durchsuchen
Ansicht
Themen-Optionen

WieFunktion des Hauptprogrammes über Pointer aus DLLstarten?

Ein Thema von christian.noeding · begonnen am 15. Sep 2006 · letzter Beitrag vom 17. Sep 2006
Antwort Antwort
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#1

WieFunktion des Hauptprogrammes über Pointer aus DLLstarten?

  Alt 15. Sep 2006, 11:44
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:

DLLActivate(@TForm1.GetValue); // DLLActivate(Funktionsadresse:Pointer) 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)

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!
Christian Nöding
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#2

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 15. Sep 2006, 12:05
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:
Type TCallback = procedure();stdcall; 3. irgendeine Funktion der DLL wie folgt aufbauen:
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:
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*
Christian Nöding
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#3

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 17. Sep 2006, 00:02
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:

procedure CallbackGetDLLNames(nummer:integer; name:PChar); ich übergebe der DLL so die Adresse:
DLLFunktion(@TMainform.CallbackGetDLLNames); und das ist sie dann:
Delphi-Quellcode:
procedure TMainform.CallbackGetDLLNames(nummer:integer; name:PChar);
begin
  ShowMessage(inttostr(nummer));
end;
In der DLL sieht das ganze jetzt so aus:
Hier in der DPR-Datei:
Delphi-Quellcode:
procedure DLLFunktion(CallbackGetDLLNames:Pointer);stdcall;
begin
  @Form1.RefreshDLLNames:=CallbackGetDLLNames;
end;
und dann in der eigentlichen Form:
Delphi-Quellcode:
type TCallbackNames = procedure(nummer:integer;name:PChar);

// blablabla

CallbackNames:TCallbackNames;

// blablabla

CallbackNames(15,@beschreibung[15]); //beschreibung[] ist ein string-array
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
Christian Nöding
  Mit Zitat antworten Zitat
MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 17. Sep 2006, 01:18
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
var Form1 : TForm1; gespeichert ist. Probier's mal aus.

Gruß,
Michael
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#5

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 17. Sep 2006, 10:58
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?
Christian Nöding
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 17. Sep 2006, 11:02
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#7

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 17. Sep 2006, 11:07
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*
Christian Nöding
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: WieFunktion des Hauptprogrammes über Pointer aus DLLstar

  Alt 17. Sep 2006, 13:24
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
procedure Button1Click(Sender: TObject); so aus:
Delphi-Quellcode:
procedure Button1Click(self: TKlassenname;Sender: TObject);
// konkret
procedure Button1Click(self: TForm1;Sender: TObject);
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
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 09:23 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