AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Pfad einer statisch gelinkten DLL herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

Pfad einer statisch gelinkten DLL herausfinden

Ein Thema von blackfin · begonnen am 30. Jun 2010 · letzter Beitrag vom 30. Jun 2010
Antwort Antwort
blackfin
(Gast)

n/a Beiträge
 
#1

Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 09:44
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

Geändert von blackfin (30. Jun 2010 um 09:54 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 09:53
Wenn sie statisch gelinkt ist, ist sie Teil der Exe. Wenn du frühe Bindung meinst, ist dieser auch nicht fest bestimt
Markus Kinzler
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 09:58
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)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#4

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:12
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:

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?

Geändert von blackfin (30. Jun 2010 um 11:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd
Online

Registriert seit: 17. Feb 2005
Ort: Weitingen
678 Beiträge
 
Delphi 12 Athens
 
#5

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:21
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Leonard

Registriert seit: 12. Okt 2005
Ort: Lutherstadt Eisleben
64 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:36
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;
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:42
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+
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Leonard

Registriert seit: 12. Okt 2005
Ort: Lutherstadt Eisleben
64 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:45
Schade, hätte ja klappen können.

Danke für den Hinweis!
Tobias
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:47
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#10

AW: Pfad einer statisch gelinkten DLL herausfinden

  Alt 30. Jun 2010, 11:55
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;

Geändert von blackfin (30. Jun 2010 um 11:58 Uhr)
  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 14:26 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