AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetModuleHandle vs. LoadLibrary

Ein Thema von Tyrael Y. · begonnen am 4. Sep 2003 · letzter Beitrag vom 4. Sep 2003
Antwort Antwort
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#1

GetModuleHandle vs. LoadLibrary

  Alt 4. Sep 2003, 16:23
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
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: GetModuleHandle vs. LoadLibrary

  Alt 4. Sep 2003, 16:25
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: GetModuleHandle vs. LoadLibrary

  Alt 4. Sep 2003, 16:29
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
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#4

Re: GetModuleHandle vs. LoadLibrary

  Alt 4. Sep 2003, 16:31
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
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#5

Re: GetModuleHandle vs. LoadLibrary

  Alt 4. Sep 2003, 16:34
..danke Hagen..

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

oder CloseHandle?
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#6

Re: GetModuleHandle vs. LoadLibrary

  Alt 4. Sep 2003, 23:22
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
  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 10:25 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