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/)
-   -   Pfad einer statisch gelinkten DLL herausfinden (https://www.delphipraxis.net/152633-pfad-einer-statisch-gelinkten-dll-herausfinden.html)

blackfin 30. Jun 2010 08:44

Pfad einer statisch gelinkten DLL herausfinden
 
Hallo Experten,

eine kurze Frage:
Wie kann ich den aktuellen Pfad einer statisch gelinkten DLL innerhalb des Delphi-Programms herausfinden?
Irgendwie stehe ich gerade auf dem Schlauch...

Edit:
Zudem würde mich interessieren, wie man eine Liste der statisch gelinkten DLL's bekommt (auch innerhalb des Programms).

vielen Dank schon mal :)

Fin

mkinzler 30. Jun 2010 08:53

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Wenn sie statisch gelinkt ist, ist sie Teil der Exe. Wenn du frühe Bindung meinst, ist dieser auch nicht fest bestimt

blackfin 30. Jun 2010 08:58

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Ok, falsch ausgedrückt, sorry!

Ich meine die frühe Bindung. Gibt es keine Möglichkeit, nach dem Programmstart herauszufinden, von wo diese geladen wurde?
Wenn jetzt z.B. die Applikation die OpenGL32.dll geladen hat, möchte ich gerne wissen, woher sie geladen wurde (also wo der Suchpfad beim Programmstart sie als erstes gefunden und geladen hat)

blackfin 30. Jun 2010 10:12

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Ich habe jetzt weiter danach gesucht und gegoogelt...aber einen Weg habe ich bisher nicht gefunden...

Nochmal eine genauere Erklärung:

Bei delphi.about.com wird es jedoch auch als "statisches laden" deklariert, wenn man eine dll-funktion so einbindet:

Delphi-Quellcode:
function CircleArea(const radius : double) : double; external 'circle.dll';

Dabei wird die DLL ja nicht Bestandteil der EXE, sondern wird direkt beim Programmstart geladen.
Was mich interessiert, ist der Pfad, aus dem diese DLL dann tatsächlich geladen wird.
Denn die Suchreihenfolge ist auf den Systemen unterschiedlich:

Zitat:

By design the DLL search order with static linking includes: the directory from which the application loaded, the system directory, the Windows directory, directories listed in the PATH environment variable.
Note also that the search order might be different for various Windows versions.
The safest is to always expect to have all the DLLs in the directory where the calling application is.
Ist ja schön, wenn der "safest way" der Weg ist, das Applikations-Verzeichnis zu nehmen.
Ich mag aber nun eben wissen, welche DLL genau verwendet wird, wenn es z.B. die gleiche DLL im System32 und im Applikations-Verzeichnis gibt und geladen werden kann.
An die Suchreihenfolge-Vorgabe mag ich mich da nicht halten, da sie ja eben unterschiedlich sein kann. Am einen System nimmt er die aus dem System32 zuerst, auf einem anderen aus dem App-Verzeichnis. Und genau das möchte ich nun rausfinden, welche dll benutzt wurde. Das muss doch irgendwie möglich sein?

joachimd 30. Jun 2010 10:21

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Du könntest versuchen die DLL (zusätzlich) dynamisch laden (LoadLibrary) und über das zurück gegebene Handle zB per GetModuleFileName dann den Dateinamen ermitteln.

Leonard 30. Jun 2010 10:36

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Zitat:

Zitat von joachimd (Beitrag 1032564)
Du könntest versuchen die DLL (zusätzlich) dynamisch laden (LoadLibrary) und über das zurück gegebene Handle zB per GetModuleFileName dann den Dateinamen ermitteln.

Ich habe es eben mal probiert, das geht sogar ohne die DLL nochmal mit LoadLibrary zu laden. Versuch mal das hier:

Delphi-Quellcode:
var
  sDLL: String;
  cHandle: Cardinal;
  cSize: Cardinal;
  aFile: array[0..MAX_PATH-1] of char;
begin
  sDLL := 'circle.dll';
  cHandle := GetModuleHandle(PAnsiChar(sDLL));
  cSize := MAX_PATH;
  GetModuleFileName(cHandle, aFile, cSize);
end;

Bernhard Geyer 30. Jun 2010 10:42

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Zitat:

Zitat von Leonard (Beitrag 1032566)
Ich habe es eben mal probiert, das geht sogar ohne die DLL nochmal mit LoadLibrary zu laden. Versuch mal das hier:

[DELPHI]
...
cHandle := GetModuleHandle(PAnsiChar(sDLL));
...

Sollte man nicht so machen (jedenfalls wenn die DLL's nicht aus dem eigenen Hause kommt. Borland hat sich durch sowas mal ins eigene Knie geschossen als in neueren Windows-Versionen bestimmte DLL's umbenannt wurden. LoadLibrary wurde von MS entsprechend angepaßt das die neue DLL (mit anderen Namen) geladen wurde. Die Implementierung von Borland hatte hier versagt da bei GetModuleHandle kein gültiges Handle zurück geliefert wurde da hier der Umleidungsmodus von MS nicht implementiert wurde.

AFAIK war das im Bereich COM+

Leonard 30. Jun 2010 10:45

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Schade, hätte ja klappen können.

Danke für den Hinweis!

Bernhard Geyer 30. Jun 2010 10:47

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Zitat:

Zitat von Leonard (Beitrag 1032570)
Schade, hätte ja klappen können.

Ein LoadLibrary stört ja auch nicht. Die DLL wird ja kein zweites mal geladen sondern nur der "Referenzzähler" hochgezählt so das bei einem FreeLibrary erst die DLL beim zurücksetzen des Zählers auf 0 entladen wird.

blackfin 30. Jun 2010 10:55

AW: Pfad einer statisch gelinkten DLL herausfinden
 
Danke für die Antworten! :)

Ich hab's jetzt rausgefunden, wie es geht, nämlich mit einem Module Snapshot aus der Tlhelp32:
Delphi-Quellcode:

uses
...,Tlhelp32
...

var
 FModuleSnapShot: THandle;
 FModule: TModuleEntry32;
 FNextModuleAvailable: boolean;
begin

  // Snapshot erzeugen
  FModuleSnapShot:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,GetCurrentProcessID);
  FModule.dwSize := SizeOf(FModule);

  // Erstes geladenes Modul holen
  FNextModuleAvailable := Module32First(FModuleSnapShot,FModule);

  while FNextModuleAvailable do
  begin
    // ---------- der Pfad des geladenen Moduls steht nun in FModule.szExePath ---------------
   
    // Nächstes geladenes Modul holen, wenn verfügbar
    FNextModuleAvailable := Module32Next(FModuleSnapShot,FModule);
  end;
 
  // Snapshot freigeben
  CloseHandle(FModuleSnapShot);
end;


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