AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi DLL Programmierung - Export von Variable / Methode
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Programmierung - Export von Variable / Methode

Ein Thema von VT · begonnen am 1. Jan 2010 · letzter Beitrag vom 1. Jan 2010
Antwort Antwort
VT

Registriert seit: 9. Dez 2002
11 Beiträge
 
#1

DLL Programmierung - Export von Variable / Methode

  Alt 1. Jan 2010, 14:56
Hallo,

frohes Neues euch allen und eine Frage zu Beginn des neuen Jahres .

Ausgangssituation:

Ich habe ein Projekt das DLLs benutzt um zusätzlichen Code einzubinden. Nun stehen ja in den DLLs bestimmte Methoden die vom Hauptprogramm aufgerufen werden. Diese Methoden haben bestimmte Signaturen. Diese Signaturen habe ich im Moment im Hauptprogramm durch type TMeineMethode = procedure(blabla); stdcall; definiert. Wenn ich nun was an den DLL Funktionen ändere, muss ich diese Änderungen auch im Hauptprogramm im type Statement ändern.

Nun dachte ich mir er wäre doch schöner wenn man das an einer Stelle hätte, dort ändert man was, kompiliert DLL und Anwendung und fertig. Ich hab mir das so gedacht:

1. eine Unit1 in der die Signaturen stehen, also im interface Teil type TMeineMethode = procedure() usw...

2. binde ich Unit1 in das DLL Projekt ein, erstelle im interface Teil des DLL Codes eine Variable mit meineMethode: TMeineMethode
3. füge ich die Implementation meiner Methode im implementation Teil des DLL Codes hinzu
4. weise der Variablen meineMethode den Zeiger meiner implementierten DLL Methode im initialization teil der DLL zu
5. exportiere die Variable meineMethode
6. kompiliere DLL

7. binde ich Unit1 in meine Hauptanwendung ein, erstelle da auch eine Variable mit meineMethode: TMeineMethode
8. lade die DLL mit LoadLibrary und weise meineMethode den Zeiger der DLL Methode mit GetProcAddress() zu
9. kompiliere Anwendung

Das geht auch alles wunderbar, GetProcAddress() findet die exportierte Variable wo ja eigentlich der Methodenzeiger der DLL Funktion drin stehen sollte. Nur wenn dann die Methode aufgerufen wird gibts eine Privileged instruction exception. Also hab ich die DLL Methode noch im interface teil angegeben. Dann kommt keine Privileged instruction exception mehr aber eine Zugriffsverletzung.

Kann mir jemand sagen warum das so ist, bzw ob mein Vorhaben so überhaupt möglich ist?

Vielen Dank.

:edit:

vieleicht zur Verdeutlichung hier noch etwas Code:

Unit1.pas

Delphi-Quellcode:
interface
  TInitMethod = procedure (AData: PInitParameter); stdcall;
DLL Main.pas

Delphi-Quellcode:
interface

uses
  Unit1.pas

var
  Init: TInitMethod;

  procedure Library_SetInOutProperty(AProperty: PInOutProperty); stdcall;

implementation

procedure Library_Init(AData: PInitParameter); stdcall;
begin

end;

initialization
  Init := @Library_Init;

end.
Hauptanwendung Main.pas

Delphi-Quellcode:
interface
   TMeineKlasse = class
   private
     fSetInOutProperty: TOutputDeviceSetInOutProperty;

   public
     function Load(): Boolean;
   end;

implementation

function TMeineKlasse.Load(): Boolean;
var
 lParameter: TInOutProperty;
begin
   ...
   LoadLibrary
   ...
   @fSetInOutProperty := GetProcAddress(..., 'Init');

   fSetInOutProperty(@lParameter); // <-- crash
end;
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

Re: DLL Programmierung - Export von Variable / Methode

  Alt 1. Jan 2010, 16:05
Hi!

Also was du auf alle Fälle machen musst bei einer DLL ist folgendes:

Delphi-Quellcode:
interface

uses
  Unit1.pas

var
  Init: TInitMethod;

  procedure Library_SetInOutProperty(AProperty: PInOutProperty); stdcall;

implementation

procedure Library_Init(AData: PInitParameter); stdcall;
begin
end;

exports
  Library_Init;


begin
end.

Durch das exports gibts du eben an, das die funktion nach aussen hin exportiert werden soll, um so auch mit GetProcAddress die Adresse bekommst.
Lars
  Mit Zitat antworten Zitat
VT

Registriert seit: 9. Dez 2002
11 Beiträge
 
#3

Re: DLL Programmierung - Export von Variable / Methode

  Alt 1. Jan 2010, 16:43
Jo, danke, das hatte ich vergessen mit hinzuschreiben das ich das schon im dpr drin hab.

Ich hab jetzt ne lösung gefunden. Ich kann die DLL Methode nun aufrufen ohne Absturz indem ich folgendes mache:

Delphi-Quellcode:
var
  lPointerToMethodPointer: ^TOutputDeviceSetInOutProperty;
...
  lPointerToMethodPointer := GetProcAddress(...'Init');
  fInit := lPointerToMethodPointer^;
...
  fInit(...); // <- klappt
Nun kann ich auch die Library_ Methode wieder aus dem interface Teil nehmen.

Ich hoffe ich zerhau mir da nicht irgendwie den Speicher.
Kennt sich jemand aus und hat da bedenken?

Anmerkung: es macht offenbar keinen Unterschied ob man in der DLL jetzt schreibt:

Init := @Library_Init; oder
@Init := @Library_Init; oder
Init := Library_Init;

Wahrscheinlich ist hier wieder Compilermagic am Werk.
  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 00:54 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