Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi DLL nicht automatisch laden (https://www.delphipraxis.net/205116-dll-nicht-automatisch-laden.html)

himitsu 3. Aug 2020 12:34

AW: DLL nicht automatisch laden
 
Statisches Linken (im Delphi/Windows), da wird der Link in die Import-Tabelle des PE-Headers eingetragen,
welche von Windows gefüllt wird, bevor der ProgrammCode anfängt mit Arbeiten.

Beim Delayed-Loading gibt es auch diese "statische" Tabelle,
aber die ist zu Beginn mit Dummyprozeduren gefüllt.
Und erst beim Aufruf einer dieser Prozeduren wird die DLL geladen und die Tabelle mit den richtigen Zeigern gefüllt.
https://docs.microsoft.com/de-de/cpp...s?view=vs-2019
http://docwiki.embarcadero.com/RADSt...indows-only.29

Beim dynamischen Laden führt der Entwickler das LoadLibrary aus und sucht via GetProcAddress seine Methoden und speichert sie in eigenen Variablen.



Für Windows ist Delayed-Loading beim Programmcode viel "schöner",
wenn man damit leben kann, dass Microsoft hier eine echt besch*** Fehlermeldung eingebaut hat, wenn das Laden fehlschlägt, sollte die DLL/Funktion fehlen.
Außerdem wurde im Delphi das Entladen nicht implementiert.

venice2 3. Aug 2020 12:47

AW: DLL nicht automatisch laden
 
Zitat:

Für Windows ist Delayed-Loading beim Programmcode viel "schöner"
Wenn ich das richtig verstehe dann verwendet C++ Delayed-Loading?
Oder ist Delayed-Loading = dynamisches laden?

In c++ wird aber statisch geladen.
Entschuldige werde da nicht so richtig draus schlau was du mir da sagen willst.

Dalai 3. Aug 2020 12:48

AW: DLL nicht automatisch laden
 
Zitat:

Zitat von venice2 (Beitrag 1471045)
Zitat:

So ganz ohne Code
Ganz ohne. Hast du ihn für Delphi übersehen?

Ich korrigiere: Mit nur der Hälfte des notwendigen Codes. Wenn du sagst, mit Delphi geht etwas nicht, mit C++ (mit welchem überhaupt, und welcher Compiler?) aber schon, du aber nur Delphi-Code zeigst, kann keiner eine sinnvolle fundierte Antwort geben, wo genau der Unterschied ist. Nur Vermutungen sind möglich, und Empfehlungen wie z.B. meine mit dem Blick auf die Importtabelle.

Soweit ich weiß bedeutet statisches Linken bei C++, dass die DLLs ins Programm (also in die EXE) einkompiliert werden. Das macht sich dann natürlich bei der Größe bemerkbar.

Grüße
Dalai

venice2 3. Aug 2020 12:55

AW: DLL nicht automatisch laden
 
Zitat:

Soweit ich weiß bedeutet statisches Linken bei C++, dass die DLLs ins Programm (also in die EXE) einkompiliert werden.
Ok. Gebe mich damit zufrieden dann erklärt das einiges, nur nicht das die Funktionen wenn die DLL mit ein kompiliert wird und diese nicht vorhanden ist nicht funktionieren.

Trotzdem Danke.

Zitat:

kann keiner eine sinnvolle fundierte Antwort geben
Kann ich verstehen.

himitsu 3. Aug 2020 12:57

AW: DLL nicht automatisch laden
 
Was C++ verwendet weiß ich nicht, aber ich wäre davon ausgegangen, dass es standardmäßig auch nur ein normales statisches Linken benutzt.

Deleyed-Loading ist wie dynamisches laden, aber mit der statischen deklaration.
Man deklariert statisch, scheibt "dynamisch" dran und der Compiler passt es im Codegenaerator dann an.

venice2 3. Aug 2020 12:58

AW: DLL nicht automatisch laden
 
Zitat:

Zitat von himitsu (Beitrag 1471052)
Was C++ verwendet weiß ich nicht, aber ich wäre davon ausgegangen, dass es standardmäßig auch nur ein normales statisches Linken benutzt.

Deleyed-Loading ist wie dynamisches laden, aber mit der statischen deklaration.
Man deklariert statisch, scheibt "dynamisch" dran und der Compiler passt es im Codegenaerator dann an.

Danke für die Information habe wieder etwas gelernt.

himitsu 3. Aug 2020 13:03

AW: DLL nicht automatisch laden
 
Ja stimmt, der Begriff "Linken" ist hier etwas doof.

In C++ kann man eine DLL LIB/OBJ/... statisch Linken,
wobei vom "Linker" der Code der DLL/LIB in die eigene EXE eingefügt wird.
In Delphi geht sowas auch, wo via {$L} bzw. {$LINK} der Code einer vorkompilierten OBJ ins eigene Programm eingebunden/gelinkt wird.
Delphi nutzt es, um z.B. die Funktionen für ZLib, RegEx, JPEG, MIDAS oder eben dieses DelayedLoading "direkt" einzubinden.

Dann gibt es eben auch noch die Links zu einer DLL, welche in der Import-Tabelle eingetragen wurden.
(das macht Delphi standardmäßig)

venice2 3. Aug 2020 13:13

AW: DLL nicht automatisch laden
 
Ich habe es jetzt so ausgelegt das es beim Dynamischen laden funktioniert. (Das es damit geht war mir klar, aber es war nicht das Thema)
Kann die DLL jetzt aus dem Anwendungspfad entfernen wenn sie nicht gefunden wird dann schütze ich die einzelnen Aufrufe mit einer Bool Value.
Danke euch für die Informationen.

Da ich mit Delphi arbeite hat sich das mit C++ erstmal erledigt.
Wollte nur mal wissen warum was wo geht oder nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr.
Seite 2 von 2     12   

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