AGB  ·  Datenschutz  ·  Impressum  







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

Dateinamen einer DLL ermitteln

Ein Thema von Sanchez · begonnen am 16. Mär 2005 · letzter Beitrag vom 30. Mär 2005
Antwort Antwort
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#1

Dateinamen einer DLL ermitteln

  Alt 16. Mär 2005, 09:25
Hallo zusammen,

Gibts es eine Möglichkeit den Dateinamen der laufenden DLL aus der DLL heraus zu ermitteln?
Ich hab dazu leider nirgendwo Hinweise gefunden.

grüße, daniel
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#2

Re: Dateinamen einer DLL ermitteln

  Alt 16. Mär 2005, 09:44
Hier enthalten:

Delphi-Quellcode:
  function GetModuleHandleFromInstance: THandle;
  var s: array[0..MAX_PATH-1] of char;
  begin
    { Find the DLL filename from the instance value. }
    GetModuleFileName(hInstance, s, sizeof(s)-1);
    { Find the handle from the filename. }
    Result := GetModuleHandle(s);
  end;
"GetModuleFileName" sollte genau das sein, was Du benötigst
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#3

Re: Dateinamen einer DLL ermitteln

  Alt 16. Mär 2005, 10:05
Danke dir, das war genau das was ich suchte.
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#4

Re: Dateinamen einer DLL ermitteln

  Alt 26. Mär 2005, 20:21
Und wie kommt man an das Instanzenhandle, wenn man es nicht hat?

Ganz einfach: Man ermittelt die MEMORY_BASIC_INFORMATION einer Variablen in der DLL mit VirtualQuery() und hat mit MEMORY_BASIC_INFORMATION.AllocationBase das Instanzenhandle.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Dateinamen einer DLL ermitteln

  Alt 27. Mär 2005, 15:25
Zitat von Mephistopheles:
Und wie kommt man an das Instanzenhandle, wenn man es nicht hat?

Ganz einfach: Man ermittelt die MEMORY_BASIC_INFORMATION einer Variablen in der DLL mit VirtualQuery() und hat mit MEMORY_BASIC_INFORMATION.AllocationBase das Instanzenhandle.
Warum so kompliziert? LoadLibrary aufrufen. Ist sie bereits geladen bekommt man das Handle der schon geladenen DLL zurück. Ist sie noch nicht geladen, bekommt man eben ein frisches Handle zurück.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#6

Re: Dateinamen einer DLL ermitteln

  Alt 27. Mär 2005, 23:12
Zitat von Luckie:
Warum so kompliziert? LoadLibrary aufrufen. Ist sie bereits geladen bekommt man das Handle der schon geladenen DLL zurück. Ist sie noch nicht geladen, bekommt man eben ein frisches Handle zurück.
Der Philosoph, der tritt herein,
Und beweist euch, es müßt' so seyn:
Das Erst' wär' so, das Zweite so,
Und drum das Dritt' und Vierte so;
Und wenn das Erst' und Zweit' nicht wär',
Das Dritt' und Viert' wär' nimmermehr.


Viel Glück dabei einen Trick zu finden, wie die aktuell geladene DLL heißt, wenn sie weder einen festen Namen noch einen festen Pfad hat. Dann verpufft nämlich dein lustiger LoadLibrary()-Aufruf, denn du weißt ja garnicht welche DLL geladen wurde (oder willst du alle im System vorhandenen so prüfen???). Angenommen du hättest den Namen: Gibst du einen Pfad zur DLL mit an, oder vertraust du auf die Windowsmethode zum Finden der DLL? In letzterem Fall könntest du *padauz* wegen SetDllDirectory() ziemlich auf die Nase fallen.
Und GetModuleHandle() funktioniert für DLLs sowieso nicht.

Erst mit GetModuleHandleEx() und GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS wurde obige von mir beschriebene Methode eingeführt - was aber erst ab Windows XP funktioniert.

Deine sogenannte Einfachheit ist also weder praktikabel (da die DLL nicht weiß wo sie liegt oder wie sie heißt) noch sinnvoll (wenn die DLL vorher nicht geladen war, mit der wir testen).
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#7

Re: Dateinamen einer DLL ermitteln

  Alt 30. Mär 2005, 07:04
Das Handle steht doch in hInstance. Ich rufe die Funktion innerhalb der gesuchten dll auf, von daher ists einfach.
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#8

Re: Dateinamen einer DLL ermitteln

  Alt 30. Mär 2005, 07:50
Zitat von Sanchez:
Das Handle steht doch in hInstance. Ich rufe die Funktion innerhalb der gesuchten dll auf, von daher ists einfach.
Ich weiß - aber nur wenn man die Standard-Delphiunits verwendet. Und in anderen Sprachen kommt man nicht so einfach an das Modulhandle, daher gehört dieser Trick in jede Trickkiste, wenn die Nutzung von GetModuleHandleEx() noch nicht möglich ist (< XP).
  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 02:55 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