Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetModuleHandle vs. LoadLibrary (https://www.delphipraxis.net/8433-getmodulehandle-vs-loadlibrary.html)

Tyrael Y. 4. Sep 2003 15:23


GetModuleHandle vs. LoadLibrary
 
Hallo zusammen,

ich habe gerade beide Windows API Funktionen benutzt.

Ich kann auch ohne Probleme beide benutzen, aber meine
Frage wäre, nur um mein Wissensbedürfnis zu befriedigen,

1.Was ist der Unterschied zwischen diesen beiden Funtionen ?

2.Wann sollte man lieber den einen oder den anderen einsetzen?

3.Gibt es bei der Freigabe des Handles Unterschiede ?


Ich denke es wäre auch für alle anderen ganz interessant das zu wissen.


Grüße an alle

Tyrael

Luckie 4. Sep 2003 15:25

Re: GetModuleHandle vs. LoadLibrary
 
Na ja, LoadLibrary wird die DLL auch in den Adressraum deiner Anwendung laden. Mit GetModuleHandle wirst du nur das Handle der DLL bekommen. Zeig doch mal Beispiel-Code, wo beide Funktionen funktioniert haben sollen.

negaH 4. Sep 2003 15:29

Re: GetModuleHandle vs. LoadLibrary
 
LoadLberary() lädt ein Modul in den Prozess wenn es noch nicht geladen wurde. Danach erhöht es den Modul-Benutzungs-Zähler um eins. Zu jeden erfolgreichen LoadLibrary() sollte man auch FreeLibrary() aufrufen.

GetModuleHandle() schaut nach ob ein Modul schon im Prozess geladen ist und gibt das Handle zurück, falls dies der Fall ist. Ausser zur Abfrage vom Kernel32 Modul oder dem eigenen Modul sollte man GetModuleHandle() nicht benutzen. Stattdessen sollte man bei anderen Modulen immer mit LoadLibrary() arbeiten, warum ?

LoadLibrary() macht wesentlich mehr als nur ein Modul zu laden. Es initialisiert auch die sogenannte "Side by Side" Technik, oder es werden bestimmte API Hooks initialisiert. All das macht GetModuleHandle() eben nicht. Somit kann es bei Verwendung von GetModuleHandle() statt LoadLibrary() besonders bei COM-DLL's zu schwer zu findenden Seiteneffekten kommen, da bestimmte Initialisierungen nicht mehr durchgeführt werden.

Gruß Hagen

Tyrael Y. 4. Sep 2003 15:31

Re: GetModuleHandle vs. LoadLibrary
 
naja, ich habe nicht beide gleichzeitig benutzt,
sondern entweder oder ...


iHandle:=GetModuleHandle(wfder32dll);
if iHandle = 0 then
iHandle:=loadlibrary(wfder32dll);
if iHandle<>0 then begin
try

Tyrael Y. 4. Sep 2003 15:34

Re: GetModuleHandle vs. LoadLibrary
 
..danke Hagen..

und bei GetModuleHandle kann icht nicht FreeLibrary benutzen ?
oder doch?

oder CloseHandle?

negaH 4. Sep 2003 22:22

Re: GetModuleHandle vs. LoadLibrary
 
Mit GetModuleHandle() ermittelte Handles müssen nicht weiter beachtet werden. d.h. kein FreeLibrary()/CloseHandle() oder so. GetModuleHandle() macht ja nichts weiter als das Handle zu einem Modulnamen zu finden, falls es geladen wurde.

Dein obiger Code ist logisch gesehen schlecht. Nimm immer LoadLibrary() in Kombination mit FreeLibrary(). Falls du diesen klitzekleinen Overhead noch weiter reduzieren möchtest dann führe LoadLibrary() nur in der Initialisierung einer Unit aus. Das Handle kommt dann in eine globale Variable, und in der Finalization Sektion der Unit wird dann FreeLibrary() benutzt. Somit wird nur einmal beim Programmstart LoadLibrary() aufgerufen.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 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