Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 19:08 Uhr.
Seite 2 von 2     12   

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