AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DLL Dynamisch Laden

Ein Thema von Ookami · begonnen am 11. Mai 2010 · letzter Beitrag vom 12. Mai 2010
Antwort Antwort
Benutzerbild von Ookami
Ookami

Registriert seit: 20. Nov 2009
Ort: Baden Württemberg
77 Beiträge
 
Delphi 2009 Architect
 
#1

DLL Dynamisch Laden

  Alt 11. Mai 2010, 23:03
Hallo zusammen,

ich weiß, dass dieses Thema schon oft diskutiert wurde. Habe selbst auch schon einige hilfreiche Tutorials dazu durchgeblättert.
Aber zum Funktionieren bringe ich das nicht. Statisch funktioniert, aber eben nicht dynamisch und jetzt wollte ich einfach einen Tip von euch.
Liegt's vielleicht an der Delphi Version? Hier Delphi 2009.

ich habe zunächst einfach ein Kapitel abgetippt zum Testen:


Die DLL
Delphi-Quellcode:
library Rechne;

uses
  SysUtils,
  Classes;

{$R *.res}

Function addiere (Value1, Value2 : Integer) : Integer; stdCall;
Begin
     Result := Value1 + Value2;
End;

Exports
       addiere;

begin
end.

Die Unit:
Delphi-Quellcode:
unit DLLUnit;

interface

Uses Windows;


Function addiere (Value1, Value2 : Integer) : Integer; stdCall;

implementation

Function addiere (Value1, Value2 : Integer) : Integer; stdCall; external 'rechne.DLL';

end.
Soweit hat man's schon oft gesehen, funktioniert auch, aber eben statisch!

Nun Dynamisch:
Delphi-Quellcode:
unit DLLUnit2;

interface

Uses Windows;


Type TAddition = Function (Value1, Value2 : Integer) : Integer;
Function addieren (Value1, Value2 : Integer) : Integer;

implementation


Function addieren (Value1, Value2 : Integer) : Integer;
Var Addition : TAddition;
         Handle : THandle;
Begin
     Handle := LoadLibrary('Rechne.DLL');
     if Handle <> 0 then
     Try
        @Addition := GetProcAddress(Handle, 'addiere');
        if @Addition <> nil then
        begin
             Result := Addition(Value1, Value2);
        end;
     Finally
          FreeLibrary(Handle);
     end;
End;

end.
Und hier hakt es bei der Result-Zeile.
Wie gesagt, nachdem das Beispiel abgetippt ist und so in zumindest ähnlicher Form in vielen verschiedenen Tut's oder Foren diskutiert wurde, eben die Frage, warum funktioniert es bei mir nicht?
Was habe ich nicht beachtet, was nicht richtig verstanden.

Ich danke euch vorab schon mal für eure Mühe
Gruß Wolfgang
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

Re: DLL Dynamisch Laden

  Alt 11. Mai 2010, 23:12
Delphi-Quellcode:
Exports
       addiere name 'addiere';
Warum das beim statischen Laden so klappt, ist mir ein Rätsel.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.923 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: DLL Dynamisch Laden

  Alt 11. Mai 2010, 23:39
@BUG: In Delphi wird standardmäßig der Name der Prozedur verwendet, wenn nicht explizit ein Export-Name angegeben ist.



Code:
Function addiere (Value1, Value2 : Integer) : Integer; [color=#ff0000][b]stdCall;[/b][/color]
...

Exports
       addiere;
Code:
Function addiere (Value1, Value2 : Integer) : Integer; [color=#ff0000][b]stdCall;[/b][/color]
  external 'rechne.DLL';
Code:
Type TAddition = Function (Value1, Value2 : Integer) : Integer;
Fällt dir was auf?

PS: Wie die "unabhängige" Funktion Addition in der DLLUnit2 deklariert ist, ist egal, aber die Signatur des Prozudurzeigers muß schon zum Export passen.

PSS: in Delphi ist bei einer Zuweisung kein @ notwendig
Delphi-Quellcode:
Addition := GetProcAddress(Handle, 'addiere');
if Assigned(Addition) then
und das Result ist nicht initialisiert, wenn die DLL oder die Funktion nicht geladen/gefunden werden kann,
aber dieses müßte der Compiler eigentlich auch bemängeln. (Compiler-Meldung)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

Re: DLL Dynamisch Laden

  Alt 11. Mai 2010, 23:53
Zitat von himitsu:
@BUG: In Delphi wird standardmäßig der Name der Prozedur verwendet, wenn nicht explizit ein Export-Name angegeben ist.
Wieder was gelernt, was sogar massiv Schreibarbeit (+Tippfehler) sparen kann
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.923 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: DLL Dynamisch Laden

  Alt 12. Mai 2010, 00:12
Man kann sogar ganze Funktions/Prozedur/Methoden-Signaturen einsparen
und bräuchte sie quasi nur im Interface zu erwähnen (außer bei überladenen Prozeduren, denn irgendwie muß Delphi ja unterscheiden können wer was ist ).
Aber wenn man sie dennoch in der Implementation angibt, dann meckert Delphi wenigstens bei Unterschieden/Fehlern.
Delphi-Quellcode:
interface

Function addieren (Value1, Value2 : Integer) : Integer;

implementation

Function addieren;
Begin
  ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Ookami
Ookami

Registriert seit: 20. Nov 2009
Ort: Baden Württemberg
77 Beiträge
 
Delphi 2009 Architect
 
#6

Re: DLL Dynamisch Laden

  Alt 12. Mai 2010, 00:27
Danke, Danke,

es funktioniert.
Manchmal ist man einfach mit Blindheit geschlagen. Dann tut es gut wenn man einem in Farbe die Augen öffnet.
Auch die anderen beiden Zusätze sind nicht nur OK, sondern Super.

Ihr habt mir sehr weitergeholfen
Gruß Wolfgang
Wolfgang
  Mit Zitat antworten Zitat
Benutzerbild von Ookami
Ookami

Registriert seit: 20. Nov 2009
Ort: Baden Württemberg
77 Beiträge
 
Delphi 2009 Architect
 
#7

Re: DLL Dynamisch Laden

  Alt 12. Mai 2010, 01:07
Inspector Columbo sagte immer "Äh, eine Frage habe ich noch". Die meine mag ja nun etwas dumm erscheinen, aber ich denke, mancher hat sich diese auch schon gestellt.

Eine DLL wird ja, oftmals von mehreren Programmen quasi gleichzeitig benutzt. In meinem Fall sollte dies letztlich so sein.
Wenn ich z.B. in einer DLL nach deren Aufruf eine Liste aufbaue, so sind diese Daten ja zunächst im Speicher abgelegt.
Wenn ich später mit einem andern Programm dieselbe DLL aufrufe und an den Dateninhalt von exakt dieser Liste zugreifen möchte, geht das dann überhaupt?
Oder ist es so, dass dann die DLL für jedes Programm eine neue Liste anlegen müsste?

PS: Wer's nicht wusste, mit dem Beispiel von Himitsu, kann man in einer DLL auch eine andere DLL dynamisch laden.
Wolfgang
  Mit Zitat antworten Zitat
schlecki

Registriert seit: 11. Apr 2005
Ort: Darmstadt
148 Beiträge
 
Delphi XE2 Enterprise
 
#8

Re: DLL Dynamisch Laden

  Alt 12. Mai 2010, 08:57
Zitat von Ookami:
Eine DLL wird ja, oftmals von mehreren Programmen quasi gleichzeitig benutzt. In meinem Fall sollte dies letztlich so sein.
Wenn ich z.B. in einer DLL nach deren Aufruf eine Liste aufbaue, so sind diese Daten ja zunächst im Speicher abgelegt.
Wenn ich später mit einem andern Programm dieselbe DLL aufrufe und an den Dateninhalt von exakt dieser Liste zugreifen möchte, geht das dann überhaupt?
Oder ist es so, dass dann die DLL für jedes Programm eine neue Liste anlegen müsste?
Jedes Programm wird deine DLL in seinen eigenen Adressraum laden => also muss auch jede Programm-DLL-Kombination die Liste selbst aufbauen. Man könnte das natürlich durch eine IPC innerhalb der DLL lösen (z.B. Memory Mapped Files). Oder du musst einen Out-of-Process-Server schreiben.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf