![]() |
ParamStr(0) mit UNC-Pfad
Hi zusammen,
ich hab da ein drolliges Problemchen. Ich möchte meiner Anwendung ermöglichen in ihrem Ordner nach einer Datei zu schauen. Ist eigentlich schnell gemacht, ohne sonstige Fehlerbehandlung, Fallbacks und SchnickSchnak erhält man:
Delphi-Quellcode:
Das funktioniert...bis man die Exe von einem UNC-Pfad startet. Dann landet man in c:\windows :shock:
if FileExists(TPath.Combine(TPath.GetDirectoryName(paramstr(0)), 'some.ini')) then
myIni := TIniFile.Create(TPath.Combine(TPath.GetDirectoryName(paramstr(0)), 'some.ini'); Ich weiß leider nicht, welche "archaischen" Techniken verwendet werden, um paramstr(0) zu befüllen, aber kann es etwas mit dem Problem zu tun haben, daß die cmd.exe (auch bekannt als DOS-Prompt), ![]() Wie komme ich unter diesen Umständen zu meinem Ausführungsverzeichnis? Sherlock |
AW: ParamStr(0) mit UNC-Pfad
Delphi-Quellcode:
Eventuell funktioniert es auch so:
var
sFilename : String; begin sFilename := Format('%s\some.ini',[ExtractFilePath(Application.ExeName)]); if FileExists(sFilename) then myIni := TIniFile.Create(sFilename); end;
Delphi-Quellcode:
var
sFilename : String; begin sFilename := '.\some.ini'; if FileExists(sFilename) then myIni := TIniFile.Create(sFilename); end; |
AW: ParamStr(0) mit UNC-Pfad
Ich weiß aber ehrlich gesagt nicht was dein Problem ist, denn ParamStr(0) liefert bei mir immer was es soll, sowohl für
\\someServer\someShare\Project1.exe sowie \\?\C:\somePath\Project1.exe Letzteres wird hierbei als C:\somePath\Project1.exe ausgegeben. Ist das das Problem? Ich habe nix mit C:\Windows. |
AW: ParamStr(0) mit UNC-Pfad
Hmmm... ich nehme alles zurück und behaupte das Gegenteil. Es läuft in einem kleinen Testprojekt wie erwartet. Mit UNC-Pfad und allem. Danke trotzdem Delphi.narium und Günther. Ich habe nur in dem eigentlichen Projekt per ProcMon sehen können, das in c:\windows nach meiner ini-Datei gesucht wurde. Muss eine andere Ursache haben... Grrrr
Edith hat noch eine kleine Anmerkung: Application.ExeName gibt es unter FMX nicht, hatte ich aber auch nicht angegeben, sorry. Unter VCL führt Application.ExeName aber auch nur paramstr(0) aus ;) Sherlock |
AW: ParamStr(0) mit UNC-Pfad
Wenn du schonmal dabei bist
Warum nicht...
Delphi-Quellcode:
if FileExists(ExtractFilePath(paramstr(0)) + 'some.ini') then
// statt viel zu kompliziert ... if FileExists(TPath.Combine(TPath.GetDirectoryName(paramstr(0)), 'some.ini')) then |
AW: ParamStr(0) mit UNC-Pfad
Ich meine mich zu erinnern, dass ParamStr schon mal als deprecated gekennzeichnet war und dass man doch bitteschön Application.Exename verwenden sollte. Doch schau mal einer guck:
Delphi-Quellcode:
function TApplication.GetExeName: string;
begin Result := ParamStr(0); end; |
AW: ParamStr(0) mit UNC-Pfad
Klar, das geht auch, Danke. Ist nur bei mir mittlerweile reine Gewohnheit Pfade und Dateinamen so zusammenzusetzen. Dann geht bei plattformübergreifenden Anwendungen zumindest in der Hinsicht nichts schief (/ statt \).
Sherlock |
AW: ParamStr(0) mit UNC-Pfad
ParamStr ist deprecated und wird von ExeName verwendet :roll:
Wenn ParamStr aber auch deprecated ist, wie soll man dann an übergebene Parameter kommen? |
AW: ParamStr(0) mit UNC-Pfad
Geh doch mal mit dem Debugger durch wo der erste Quatsch liefert. Ist es Paramstr(0)?
|
AW: ParamStr(0) mit UNC-Pfad
Starter-Version :thumb:
|
AW: ParamStr(0) mit UNC-Pfad
Wird das Programm vielleicht als Administrator von einem Netzlaufwerk ausgeführt? Falls ja: Netzlaufwerke sind nutzerspezifisch, genauer gesagt an ein Token gebunden. D.h. das vom Nutzer verbundene Netzlaufwerk gibt's beim Administrator nicht.
Grüße Dalai |
AW: ParamStr(0) mit UNC-Pfad
Stimmt, Netzlaufwerk vs. Admin ist eine gute Idee! :thumb:
Wie lang ist der UNC-Pfad? Wenn ich mir den Quellcode in der Delphi-RTL zu ParamStr() anschaue - Da wird die Rückgabe von GetModuleFileName nicht ausgewertet (wenn z.B. der 260 lange Puffer nicht reicht). ![]() |
AW: ParamStr(0) mit UNC-Pfad
ParamStr(0) und
![]() ![]() aber nur theoretisch, denn da dort auch ein relativer Pfad drin stehn kann, weil das genau dem Aufruf z.B. im ![]() nimmt Delphi stattdessen den Wert aus GetModuleFileName(0), was dem Pfad der gemappten EXE im Arbeitsspeicher entspricht. Am, Ende kommt es darauf an, wie Windows den Namen des gemappten Speicherbereichs auflöst und wie TPath.Combine mit UNC-Pfaden umgeht. Ich würde erstmal bei TPath nachsehn, da ich mit dem Zeug öfters mal Probleme habe und nicht immer alles so geht, wie man es vermuten könnte. :wall: * Was gibt ParamStr(0) für einen Wert aus? * Auch mal GetCommandLine und GetModuleFileName direkt ansehn * und was macht TPath.Combine |
AW: ParamStr(0) mit UNC-Pfad
Danke für die Anregungen, ich werde das beim Kunden ausprobieren. Hoffentlich denke ich daran, Rückmeldung zu geben. Aber im Prinzip scheint Delphi alles richtig zu machen. Vermutlich bin ich das Problem :stupid:
Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz