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 der eigenen Anwendung - ohne Application. Param... (https://www.delphipraxis.net/50838-pfad-der-eigenen-anwendung-ohne-application-param.html)

tn249 1. Aug 2005 20:01


Pfad der eigenen Anwendung - ohne Application. Param...
 
Hallo,

Hab keine Ahnung ob das was ich versuche überhaupt funktioniert, aber fragen kann man ja mal.

Ich habe eine Klasse, also den Protoptyp eines Objekts.

Im constructor der Klasse möchte ich den Pfad der Anwendung in eine Variable schreiben, jedoch ohne eine Variable aus der aufrufenden Funktion zu übergeben.

Geht das evtl. über irgendwelche API-Aufrufe?

Welche anderen Ansätze gibt es?

Gruß
tn249

SMO 1. Aug 2005 20:06

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Ich nehme an, du meinst ohne "Application.ExeName". Du kannst stattdessen "ParamStr(0)" benutzen, ist dasselbe.

tn249 1. Aug 2005 20:10

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Ich meinte .Paramstr(0), .Exename basiert auf .Paramstr(0).

In dem von mir oben geschildertem Fall hab die gesamte "Application" nicht zur Verfügung.

Gruß
tn249

marabu 1. Aug 2005 20:28

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Das sollte funktionieren:

Delphi-Quellcode:
uses
  Windows;

function ExeName: string;
begin
  SetLength(Result, 261);
  SetLength(Result, GetModuleFileName(0, @Result[1], Length(Result)));
end;
Grüße vom marabu

SMO 1. Aug 2005 20:30

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Ja, genau, Application.ExeName basiert auf ParamStr(0). Die ParamStr-Funktion kommt aus der Unit "System" und ist daher überall verfügbar, auch ohne Application-Objekt.

Also kannst du ParamStr(0) benutzen. Oder gleich die WinAPI-Funktion GetModuleFileName, die ruft ParamStr(0) nämlich intern auf.

tn249 1. Aug 2005 20:40

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Gut vielen Dank euch beiden. Es funktioniert soweit.

Der Vollständigkeit halber erwähne ich jedoch noch, dass GetModuleFileName nicht nur den Pfad liefert, sondern auch noch den Dateiname selbst. (Zumindest in meinem Test)

aber das ist ja mit EctractFilePath dann kein großes Ding mehr.

Gruß
tn249

Christian Seehase 1. Aug 2005 20:59

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Moin tn249,

Zitat:

Zitat von tn249
Der Vollständigkeit halber erwähne ich jedoch noch, dass GetModuleFileName nicht nur den Pfad liefert, sondern auch noch den Dateiname selbst.

was auch ParamStr(0) bzw. Application.ExeName auch tun.
Es ist eben der Pfad und nicht das Verzeichnis der Anwendung. ;-)

tn249 1. Aug 2005 21:07

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Hm. Ich glaub die 10 Stunden pralle Sonne und die giftige verstrichene Farbe ham doch etwas mehr als nur dröhnendes Hämmern in meinem Kopf hinterlassen :gruebel: :wall:

Olli 2. Aug 2005 09:00

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
@marabu: Statt 261 bitte "MAX_PATH+1" verwenden. Man sollte sich immer vor Augen halten, daß es auf der C-Seite #defines sind. Und die können sich potentiell auch ändern ;)

Und seien wir mal ehrlich, da es Literale sind, macht es doch auch zur Laufzeit keinen Unterschied. In der Wartbarkeit aber potentiell schon.

Beste Grüße an den marabu,

thule 26. Jan 2008 19:19

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Hallo. Das ist mein erster Post und dann auch gleich schon eine frage.
Ich lerne delphi privat aus interesse und hier ist schon lange eine DER quellen für gute erklärungen.

Mich Interessiert:

wenn meine anwendung (console) als parameter [ParamStr(1)] einer anderen gestartet wird bekomme ich mit ParamStr(0) nur Die Hostanwendung. Wie komme ich an den Exe-Name meiner eigenen anwendungen IMMER mit sicherheit? Oder mache ich etwas falsch?

Gruß, Thule

Black-Horse 7. Feb 2008 10:15

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Application.Exename kannst du in dem fall verwenden

Luckie 7. Feb 2008 11:19

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Zitat:

Zitat von Black-Horse
Application.Exename kannst du in dem fall verwenden

Was keinen Unterschied macht, da Application.Exename auch nur ParamStr(0) aufruft. Mit ParamStr0) sollte man immer den Pafd der aufrufenden Exe-Datei bekommen, egal ob sie von einer anderen Anwendung gestartet wurde oder nicht.

Olli 7. Feb 2008 21:38

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Komplizierter wird es nur noch, wenn man die Situation hat, daß man den Pfad der DLL aus der aktuellen DLL haben will, man aber (weil bspw. ursprünglich aus einer Bibliothek stammend) hInstance (der DLL) nicht kennt, NULL nicht nutzen kann, GetModuleHandle(NULL) auch keinen Sinn macht. Die generischste und meines Erachtens nach beste Methode zum Ermitteln des Pfades des aktuellen Moduls (nicht der EXE selbst, sondern des Moduls in dem der Code ausgeführt wird) ist, eine statische Variable zu deklarieren (also nicht auf dem Stack ;)) und die Basisadresse des Moduls aus der Adresse dieser Variablen zu ermitteln. Alternativ zur statischen Variablen geht auch ein Pointer auf die aktuelle Funktion welche unten beschriebene beschriebene Methode implementiert.

Dazu wird MSDN-Library durchsuchenVirtualQuery benutzt. Erster Parameter ist die Adresse der statischen Variablen. Zweiter Parameter ist ein Zeiger auf eine MEMORY_BASIC_INFORMATION-Struktur, deren Member "BaseAddress" nach dem (erfolgreichen) Aufruf von MSDN-Library durchsuchenVirtualQuery nur noch in HMODULE/HINSTANCE gecastet werden muß und dann wirklich die korrekte Basisadresse enthält.

Delphi-Quellcode:
GetModuleFileName(HMODULE(mbi->BaseAddress), Puffer, Groesse);

thule 14. Feb 2008 15:37

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Ich habe mein Problem mit Hilfe des Prozessmanagements gelößt:

Delphi-Quellcode:
uses
  PSAPI, TlHelp32;

function GetProcessExeName(hProcess: THandle): String;
var                                                                          
  ModuleEntry: TModuleEntry32;                                      
  hModuleEntry: THandle;                                                      
  ProcessId: Cardinal;
begin
  if hProcess = INVALID_HANDLE_VALUE then Exit;
  ProcessId := GetWindowThreadProcessId(hProcess);
  hModuleEntry := CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
  ModuleEntry.dwSize := SizeOf(TModuleEntry32);
  Module32First(hModuleEntry, ModuleEntry);
  Result := MOduleEntry.szExePath;
  CloseHandle(hModuleEntry);
end;  

//Bsp:
 EXE_Dir_String := ExtractFilePath(GetProcessExeName(0));
//scheint gut zu functionieren.
Gruß

SirThornberry 14. Feb 2008 15:43

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
@tn249: Warum darf es nicht Application.ExeName sein trotz dessen das du ExtractFilePath verwendest?

sirius 14. Feb 2008 17:13

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Zitat:

Zitat von SirThornberry
@tn249: Warum darf es nicht Application.ExeName sein trotz dessen das du ExtractFilePath verwendest?

Ob der nach 2,5 Jahren noch antwortet :gruebel:

thule 14. Feb 2008 18:19

Re: Pfad der eigenen Anwendung - ohne Application. Param...
 
Zitat:

Zitat von SirThornberry
@tn249: Warum darf es nicht Application.ExeName sein trotz dessen das du ExtractFilePath verwendest?

Weil das "application" objekt in der forms-unit definiert ist?(kp) ^^

gruß.


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