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 Pfad+Name der aktuellen DLL aus DLL heraus ermitteln... (https://www.delphipraxis.net/51231-pfad-name-der-aktuellen-dll-aus-dll-heraus-ermitteln.html)

FriFra 8. Aug 2005 20:54


Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Ich hab ein kleines Problem...
Meine DLL wird von einem fremden Programm dynamisch gebunden und eine Funtion daraus aufgerufen. Nun habe ich das Problem, dass ich gern die Versionsnummer meiner DLL auslesen würde, aber ich weiß eben nicht, wo sich die DLL genau befindet :roll: , wie bekomme ich nun den genauen Pfad + Dateinamen (ja die dll könnte auch umbenannt worden sein) heraus?

Luckie 8. Aug 2005 21:01

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
MSDN-Library durchsuchenGetModuleFilename mit HInstance als ersten Parameter.

SirThornberry 8. Aug 2005 21:14

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
oder gleich GetModuleName welches auf die gepostete funktion aufbaut.

Olli 8. Aug 2005 21:29

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Aua aua aua ... da haben wohl zwei nicht gelesen.
Ich poste die Lösung gleich. Hatte ich schonmal hier in der Sparte gepostet. Moment!

SirThornberry 8. Aug 2005 21:30

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
warum nicht gelesen? den genauen Pfad der DLL (inklusive Dateinamen) bekommt man so. Und wie er die Versionsnummer ausliest weiß er doch.

Olli 8. Aug 2005 21:33

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Was wenn er kein hInstance hat? Hast du die Lösung dann? :mrgreen:

Voila, das hatte ich doch schonmal unter anderem Namen (Mephistopheles) beantwortet:
Dateinamen einer DLL ermitteln
Zitat:

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


SirThornberry 8. Aug 2005 21:35

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
in der DLL ist doch HInstance immer global vorhanden :wink:
er will ja innerhalb der DLL von eben dieser den Dateinamen und somit ist auch die HInstance bekannt.

NicoDE 8. Aug 2005 21:36

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Zitat:

Zitat von Olli
Was wenn er kein hInstance hat? Hast du die Lösung dann? :mrgreen:

Ich gehe davon aus, dass er (wie 99,999999%) die Standard-Delphi-RTL benutzt :)

Olli 8. Aug 2005 21:36

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Zitat:

Zitat von SirThornberry
in der DLL ist doch HInstance immer global vorhanden :wink:

Wenn, und nur wenn, du die Standardunits verwendest. Eine Standardlösung ist und kann dies jedoch nicht sein.

FriFra 8. Aug 2005 21:36

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Danke, jetzt hab ich's
Delphi-Quellcode:
var
...
  DllName: array[0..MAX_PATH-1] of char;
begin
GetModuleFileName(hInstance, DllName, sizeof(DllName)-1);
...

Olli 8. Aug 2005 21:40

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Zitat:

Zitat von FriFra
Delphi-Quellcode:
var
...
  DllName: array[0..MAX_PATH-1] of char;

Kleiner Tip: wenn du deine EXE nicht künstlich aufblähen willst, solltest du lieber auf String zurückgreifen und den Puffer des Strings mit SetLength() setzen um Platz für den Modulnamen zu schaffen (das landet dann auf dem Heap). So landet die entsprechende Variable selbst nicht auf dem Stack und die EXE/DLL bleibt kleiner (hier um 260 Zeichen).

SirThornberry 8. Aug 2005 21:47

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
ok, ich hab das jetzt mal so probiert:
Delphi-Quellcode:
var a: TMemoryBasicInformation;
    LBuffer: String;
begin
  FillChar(a, SizeOf(a), 0);
  VirtualQuery(@a, a, SizeOf(a));
  SetLength(LBuffer, MAX_PATH);
  GetModuleFileName(Cardinal(a.AllocationBase), PChar(LBuffer), Length(LBuffer));
  showmessage(LBuffer);
was ist jetzt falsch?

Luckie 8. Aug 2005 22:05

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
So war es gemeint:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Path: String;
begin
  Setlength(Path, MAX_PATH+1);
  Setlength(Path, GetModuleFileName(HInstance, PChar(Path), MAX_PATH));
  ShowMessage(Path);
end;

Olli 8. Aug 2005 22:09

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Zitat:

Zitat von SirThornberry
was ist jetzt falsch?

Nix, sieht beim öberflächlichen Drüberschauen gut aus. Wenn du Standardunits benutzt, kannst du es mit hInstance vergleichen.

SirThornberry 8. Aug 2005 22:16

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
a.AllocationBase weicht von HInstance ab.
a.AllocationBase ist immer $3000

Olli 8. Aug 2005 22:19

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Dann stimmt was an deinem Code nicht :-D
Ich gucke es mir morgen vielleicht mal an. Bin jetzt gerade dabei Luckie zu helfen.

SirThornberry 8. Aug 2005 22:20

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
ich habs gefunden, wenn ich bei VirtualQuery als ersten Parameter die Adresse einer globalen Angebe funktioniert es, nur eben bei der lokalen Variablen nicht.

es sieht jetzt also wie folgt aus
Delphi-Quellcode:
[...]
implementation

{$R *.dfm}

var GlobalVar: Cardinal;

procedure TForm1.FormCreate(Sender: TObject);
var QueryRes: TMemoryBasicInformation;
    LBuffer: String;
begin
  VirtualQuery(@GlobalVar, QueryRes, SizeOf(QueryRes));
  SetLength(LBuffer, MAX_PATH);
  SetLength(LBuffer, GetModuleFileName(Cardinal(QueryRes.AllocationBase), PChar(LBuffer), Length(LBuffer)));
  showmessage(String(LBuffer));
end;

Olli 8. Aug 2005 22:31

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
Zitat:

Zitat von SirThornberry
ich habs gefunden, wenn ich bei VirtualQuery als ersten Parameter die Adresse einer globalen Angebe funktioniert es, nur eben bei der lokalen Variablen nicht.

Irrtum. Aber danke für den Hinweis. Objekte in Delphi liegen auf dem Heap. Damit ist klar welche Adresse du bekommen hast, denn du hast die Funktion von innerhalb einer Methode aufgerufen. Daher bekamst du die Lage des Objektes im Speicher, nicht jedoch die einer Stackvariablen. Fazit: es muß sich um eine Stackvariable handeln ;)

brechi 8. Aug 2005 22:41

Re: Pfad+Name der aktuellen DLL aus DLL heraus ermitteln...
 
schöner ist es vielleicht wenn man eine funktion draus macht:

Delphi-Quellcode:
function GetModulePath: String;
var QueryRes: TMemoryBasicInformation;
    LBuffer: String;
begin
  VirtualQuery(@GetModulePath, QueryRes, SizeOf(QueryRes));
  SetLength(LBuffer, MAX_PATH);
  SetLength(LBuffer, GetModuleFileName(Cardinal(QueryRes.AllocationBase), PChar(LBuffer), Length(LBuffer)));
  result := LBuffer;
end;


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