Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ParamStr(0) mit UNC-Pfad (https://www.delphipraxis.net/194515-paramstr-0-mit-unc-pfad.html)

Sherlock 1. Dez 2017 11:46

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:
if FileExists(TPath.Combine(TPath.GetDirectoryName(paramstr(0)), 'some.ini')) then
    myIni := TIniFile.Create(TPath.Combine(TPath.GetDirectoryName(paramstr(0)), 'some.ini');
Das funktioniert...bis man die Exe von einem UNC-Pfad startet. Dann landet man in c:\windows :shock:

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), keine UNC-Pfade kann?

Wie komme ich unter diesen Umständen zu meinem Ausführungsverzeichnis?

Sherlock

Delphi.Narium 1. Dez 2017 12:03

AW: ParamStr(0) mit UNC-Pfad
 
Delphi-Quellcode:
var
  sFilename : String;
begin
  sFilename := Format('%s\some.ini',[ExtractFilePath(Application.ExeName)]);
  if FileExists(sFilename) then myIni := TIniFile.Create(sFilename);
end;
Eventuell funktioniert es auch so:
Delphi-Quellcode:
var
  sFilename : String;
begin
  sFilename := '.\some.ini';
  if FileExists(sFilename) then myIni := TIniFile.Create(sFilename);
end;

Der schöne Günther 1. Dez 2017 12:22

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.

Sherlock 1. Dez 2017 12:28

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

LTE5 1. Dez 2017 12:31

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

Codehunter 1. Dez 2017 12:37

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;

Sherlock 1. Dez 2017 12:38

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

LTE5 1. Dez 2017 12:39

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?

Der schöne Günther 1. Dez 2017 12:42

AW: ParamStr(0) mit UNC-Pfad
 
Geh doch mal mit dem Debugger durch wo der erste Quatsch liefert. Ist es Paramstr(0)?

LTE5 1. Dez 2017 12:46

AW: ParamStr(0) mit UNC-Pfad
 
Starter-Version :thumb:

Dalai 1. Dez 2017 13:06

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

Der schöne Günther 1. Dez 2017 13:09

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).

https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

himitsu 1. Dez 2017 13:58

AW: ParamStr(0) mit UNC-Pfad
 
ParamStr(0) und Delphi-Referenz durchsuchenApplication.ExeName gibt "theoretisch" den ersten "Parameter" im MSDN-Library durchsuchenGetCommandLine wieder,
aber nur theoretisch, denn da dort auch ein relativer Pfad drin stehn kann, weil das genau dem Aufruf z.B. im MSDN-Library durchsuchenShellExecute entspricht,
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

Sherlock 1. Dez 2017 15:09

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:19 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