Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi C: = C:\Windows\System32 (https://www.delphipraxis.net/129147-c-%3D-c-%5Cwindows%5Csystem32.html)

Dezipaitor 13. Feb 2009 12:22


C: = C:\Windows\System32
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin gerade auf ein merkwürdiges Phänomen gestossen.
Es lässt sich unter Turbo Delphi, D2006, D2007 und D2009 herstellen.
Derzeit habe ich es nur unter Vista ausprobiert.

Das Problem ist der unten stehende und als Datei angehängte Quelltext. Er ruf GetFullPathName auf verschiedene Arten auf, jedoch mit demselben Parameter "C:". (Es ist schon Absicht, dass es nicht "C:\" ist.)
Die Ausgabe unter den oben genannten Delphi ist bei mir "C:\Windows\System32". Starte ich es im Windows Explorer, kommt "C:\" dabei heraus.

Die MSDN unter http://msdn.microsoft.com/en-us/library/aa364963(VS.85).aspx lässt sich nicht genau aus über das "C:" aus. Die einzige Erwähnung behandelt Mapped-Drives (aber ich denke es ist eben dieser Fall hier.).
Zitat:

Share and volume names are valid input for lpFileName. For example, the following list identities the returned path and file names if test-2 is a remote computer and U: is a network mapped drive:
...
* If you specify "U:" the path returned is "U:\"
In Delphi 7 funktioniert es wie mit dem Windows Explorer. Ein äquivalentes C++ Programm hat mir auch "C:\" geliefert.
Weiterhin habe ich ein Manifest eingebunden, dass das Ergebnis allerdings unverändert lies. Auch Administratorenrechte helfen hier (natürlich) nicht.

Ersetzt auch mal "C:" durch andere Laufwerksbuchstaben.

Könnt ihr mal bitte ausprobieren, was bei euch rauskommt?

Delphi-Quellcode:
program Test;

{$APPTYPE CONSOLE}

{.$R manifest.res} //mit oder ohne manifest. macht kein unterschied
uses
  Windows,
  SysUtils;

function ExpandFileName(FileName: WideString): WideString;
var
  FName: PWideChar;
  Buffer: PWideChar;
  len : Cardinal;
begin
  result := FileName;

  //just check the necessary space for the filename
  Buffer := nil;
  len := GetFullPathNameW(PWideChar(FileName), 0, Buffer, FName);

  if Len = 0 then
    exit;

  Buffer := PWideChar(LocalAlloc(LPTR, (5+len)*2));

  GetFullPathNameW(PWideChar(FileName), len, Buffer, FName);

  result := WideString(Buffer);
  LocalFree(Cardinal(Buffer));
end;

function ExpandFileNameA(FileName: AnsiString): AnsiString;
var
  FName: PAnsiChar;
  Buffer: PAnsiChar;
  len : Cardinal;
begin
  result := FileName;

  //just check the necessary space for the filename
  Buffer := nil;
  len := GetFullPathNameA(PAnsiChar(FileName), 0, Buffer, FName);

  if Len = 0 then
    exit;

  Buffer := PAnsiChar(LocalAlloc(LPTR, (5+len)*2));

  GetFullPathNameA(PAnsiChar(FileName), len, Buffer, FName);

  result := AnsiString(Buffer);
  LocalFree(Cardinal(Buffer));
end;


function ExpandFileName3(FileName: WideString): WideString;
var
  FName: PWideChar;
  Buffer: array[0..MAX_PATH] of WideChar;
  len : Cardinal;
begin
  result := FileName;

  len := sizeof(Buffer) div 2;

  GetFullPathNameW(PWideChar(FileName), len, @Buffer, FName);

  result := WideString(Buffer);
end;

{

http://msdn.microsoft.com/en-us/library/aa364963(VS.85).aspx
}

begin
  writeln('Input: "C:"');
  writeln('SysUtils.ExpandFileName : ',SysUtils.ExpandFileName('C:'));
  writeln('WideString ExpandFileName: ',ExpandFileName('C:'));
  writeln('AnsiString ExpandFileName: ',ExpandFileNameA('C:'));
  writeln('Fixed Buffer Size ExpandFileName: ',ExpandFileName3('C:'));
  readln;
  { TODO -oUser -cConsole Main : Hier Code einfügen }
end.

Daniel 13. Feb 2009 12:28

Re: C: = C:\Windows\System32
 
Delphi 2009 unter Vista x86:

(1) lokales LW:
Input: "C:"
SysUtils.ExpandFileName : C:\Users\Daniel\Documents\RAD Studio\Projekte
WideString ExpandFileName: C:\Users\Daniel\Documents\RAD Studio\Projekte
AnsiString ExpandFileName: C:\Users\Daniel\Documents\RAD Studio\Projekte
Fixed Buffer Size ExpandFileName: C:\Users\Daniel\Documents\RAD Studio\Projekte


(2) Netz-LW:
Input: "T:"
SysUtils.ExpandFileName : T:\
WideString ExpandFileName: T:\
AnsiString ExpandFileName: T:\
Fixed Buffer Size ExpandFileName: T:\

himitsu 13. Feb 2009 12:30

Re: C: = C:\Windows\System32
 
Aus DOS Zeiten kenn ich es so, daß C: dann nur das Laufwerk ändert, und dann auf das dort aktuelle Verzeichnis verweist.
Auch in der Eingabeaufforderung/CMD isses so.

da Würde ich mich also nicht wundern, wenn es öfters mal wo anders hinzeigt :angel2:

Dezipaitor 13. Feb 2009 12:32

Re: C: = C:\Windows\System32
 
Ich habe mal mit allen Delphi den Laufwerksbuchstaben geändert.
"E:" ist meine Programmpartition, wo u.a. auch Delphi installiert ist:

"E:"
  • Delphi 2006 : e:\borland\rad studio\4.0\license
  • Delphi 2007 : e:\borland\rad studio\5.0\license
  • Delphi 2009 : e:\borland\rad studio\6.0\license


"F:" CD-ROM
  • Delphi 2006 : F:\
  • Delphi 2007 : F:\
  • Delphi 2009 : F:\

"N:" Festplatte
  • Delphi 2006 : N:\
  • Delphi 2007 : N:\
  • Delphi 2009 : N:\

Es ist garnicht notwendig den Code in jeder Delphiversion neu zu kompilieren. Delphi startet es einfach und das obige Ergebnis erscheint.

Mir scheint so, als ob Delphi seine Finger im Spiel hat.

himitsu 13. Feb 2009 12:34

Re: C: = C:\Windows\System32
 
Sag ich doch :angel:
laßt mal das Programm aktiv ... öffnet 'nen FileOpen-Dialog, spielt dort etwas rum und schaut mal was mit dem Verzeichnis passiert.

Dezipaitor 13. Feb 2009 12:40

Re: C: = C:\Windows\System32
 
Okay, aber was soll da passieren? Ich habe nichts feststellen können.

RWarnecke 13. Feb 2009 12:44

Re: C: = C:\Windows\System32
 
Ich habe nur Delphi 2007, deshalb kann ich es nur darunter testen :

Wenn ich das RAD Studio mit dem Arbeitsverzeichnis "D:\Entwicklung" starte kommt folgendes raus :

Input: "C:"
SysUtils.ExpandFileName : c:\program files (x86)\codegear\rad studio\5.0\license
WideString ExpandFileName: c:\program files (x86)\codegear\rad studio\5.0\license
AnsiString ExpandFileName: c:\program files (x86)\codegear\rad studio\5.0\license
Fixed Buffer Size ExpandFileName: c:\program files (x86)\codegear\rad studio\5.0\license

Wenn ich jetzt allerdings das RAD Studio mit dem Arbeitsverzeichnis "C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin" kommt folgendes raus :

Input: "C:"
SysUtils.ExpandFileName : C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin
WideString ExpandFileName: C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin
AnsiString ExpandFileName: C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin
Fixed Buffer Size ExpandFileName: C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin

Alles getestet unter Windows VISTA x64.

Edit:
Ich lasse das Arbeitsverzeichnis auf "C:\Program Files (x86)\CodeGear\RAD Studio\5.0\bin" kommt folgendes raus :

Input: "D:"
SysUtils.ExpandFileName : D:\Delphi-Praxis-Forum\build
WideString ExpandFileName: D:\Delphi-Praxis-Forum\build
AnsiString ExpandFileName: D:\Delphi-Praxis-Forum\build
Fixed Buffer Size ExpandFileName: D:\Delphi-Praxis-Forum\build

Input: "E:"
SysUtils.ExpandFileName : E:\
WideString ExpandFileName: E:\
AnsiString ExpandFileName: E:\
Fixed Buffer Size ExpandFileName: E:\

Das heißt für mich, dass wenn ich das Laufwerk verweise, wo Delphi installiert ist, wird das Arbeitsverzeichnis genommen oder das Licenceverzeichnis. Wenn ich jetzt auf das Laufwerk verweise, wo die Test.exe ausgeführt wird, wird mir ebenfalls das Arbeistverzeichnis angegeben. Verweise ich auf ein Laufwerk, welche nichts mit dem Testprogramm noch mit Delphi in dem Moment zu tun hat, dann bekommt ich nur den Laufwerksbuchstaben.

mirage228 13. Feb 2009 13:13

Re: C: = C:\Windows\System32
 
Alles mit D2005 Update 3 Prof. unter XP Prof SP3

Input: "C:"
SysUtils.ExpandFileName : C:\Dokumente und Einstellungen\mirage228
WideString ExpandFileName: C:\Dokumente und Einstellungen\mirage228
AnsiString ExpandFileName: C:\Dokumente und Einstellungen\mirage228
Fixed Buffer Size ExpandFileName: C:\Dokumente und Einstellungen\mirage228
Edit -- Info: Die Licence-Infos für D2005 sind in diesem Ordner.

Input: "D:"
SysUtils.ExpandFileName : D:\
WideString ExpandFileName: D:\
AnsiString ExpandFileName: D:\
Fixed Buffer Size ExpandFileName: D:\

Input: "E:"
SysUtils.ExpandFileName : E:\
WideString ExpandFileName: E:\
AnsiString ExpandFileName: E:\
Fixed Buffer Size ExpandFileName: E:\

Input: "F:"
SysUtils.ExpandFileName : F:\
WideString ExpandFileName: F:\
AnsiString ExpandFileName: F:\
Fixed Buffer Size ExpandFileName: F:\

Input: "G:" (DVD-RW)
SysUtils.ExpandFileName : G:\
WideString ExpandFileName: G:\
AnsiString ExpandFileName: G:\
Fixed Buffer Size ExpandFileName: G:\

Input: "H:"
SysUtils.ExpandFileName : H:\
WideString ExpandFileName: H:\
AnsiString ExpandFileName: H:\
Fixed Buffer Size ExpandFileName: H:\

Input: "I:"
SysUtils.ExpandFileName : I:\
WideString ExpandFileName: I:\
AnsiString ExpandFileName: I:\
Fixed Buffer Size ExpandFileName: I:\

Input: "J:"
SysUtils.ExpandFileName : J:\
WideString ExpandFileName: J:\
AnsiString ExpandFileName: J:\
Fixed Buffer Size ExpandFileName: J:\

Viele Grüße

Dezipaitor 13. Feb 2009 13:32

Re: C: = C:\Windows\System32
 
Ich habe es nun noch gründlicher erforsch und musste feststellen, dass ein ähnliches Verhalten unter MSDev passiert.

"C:" HD (System)
* C++ (MSDEV) : C:\
* WExplorer : C:\
* Delphi 7 : C:\

* Delphi 2006 : C:\Windows\System32
* Delphi 2007 : C:\Windows\System32
* Delphi 2009 : C:\Windows\System32

"E:" HD (contains Delphi, MSDEV)
* C++ (MSDEV) : E:\Microsoft Visual Studio 2008\Common7\IDE
* WExplorer : E:\
* Delphi 7 : E:\

* Delphi 2006 : e:\borland\rad studio\4.0\license
* Delphi 2007 : e:\borland\rad studio\5.0\license
* Delphi 2009 : e:\borland\rad studio\6.0\license


"F:" CD-ROM
* C++ (MSDEV) : F:\
* WExplorer : F:\
* Delphi 7 : F:\
* Delphi 2006 : F:\
* Delphi 2007 : F:\
* Delphi 2009 : F:\



"N:" HD

* C++ (MSDEV) : N:\
* WExplorer : N:\
* Delphi 7 : N:\
* Delphi 2006 : N:\
* Delphi 2007 : N:\
* Delphi 2009 : N:\

"P:" HD

* C++ (MSDEV) : P:\... -> Points to the location of the Project file
* WExplorer : P:\
* Delphi 7 : P:\... -> Points to the location of the EXE/Project file
* Delphi 2006 : P:\... -> Points to the location of the EXE/Project file
* Delphi 2007 : P:\... -> Points to the location of the EXE/Project file
* Delphi 2009 : P:\... -> Points to the location of the EXE/Project file


Zitat:

Zitat von himitsu
laßt mal das Programm aktiv ... öffnet 'nen FileOpen-Dialog, spielt dort etwas rum und schaut mal was mit dem Verzeichnis passiert.

Meinst du folgendes:
Öffnen Dialog in Delphi öffnen, zu der EXE-Datei springen und diese mir rechterMaustaste -> Öffnen, starten. Da haben wir dieselben Ergebnisse.

nahpets 13. Feb 2009 13:37

Re: C: = C:\Windows\System32
 
Hallo,

was passiert denn, wenn Du Dein Programm mal dahingehend änderst:
Delphi-Quellcode:
begin
  writeln('Input: "C:"');
  writeln('SysUtils.ExpandFileName : ',SysUtils.ExpandFileName('C:'));
  writeln('WideString ExpandFileName: ',ExpandFileName('C:'));
  writeln('AnsiString ExpandFileName: ',ExpandFileNameA('C:'));
  writeln('Fixed Buffer Size ExpandFileName: ',ExpandFileName3('C:'));
  ChDir('C:\Temp\');
  writeln('Input: "C:"');
  writeln('SysUtils.ExpandFileName : ',SysUtils.ExpandFileName('C:'));
  writeln('WideString ExpandFileName: ',ExpandFileName('C:'));
  writeln('AnsiString ExpandFileName: ',ExpandFileNameA('C:'));
  writeln('Fixed Buffer Size ExpandFileName: ',ExpandFileName3('C:'));
  readln;
end.
Ist das Ergebnis unverändert?

Habe das Ganze mal mit Delphi 7 kompiliert und aus der IDE gestartet. Dann steht alles auf C:\.
Dann habe ich das Programm über eine CMD, die ich aus dem WindowsCommander aufgerufen habe gestartet. Dann bekomme ich überall den Pfad, in den ich zuletzt mit dem WindowsCommander auf C: gewechselt bin. Das lässt sich durch Verzeichniswechsel im WindowsCommander und anschließendem neuen Aufruf von cmd und dann Programmstart wiederholen.
Das Verhalten ist identisch, wenn ich das Programm aus dem WindowsCommander durch Doppelklick starte, ohne zusätzliche CMD.
Starte ich das Programm über Ausführen, so erhalte ich überall C:\, da ausführen (soweit ich weiß) über den Explorer geht und der beim Start auf C:\ steht.

Das Ganze kannst Du auch über den Explorer nachvollziehen.
Starte ihn mal und wechsle auf C:.
Dann gibst Du als Adresse Dein Programm an und startest es. Du solltest überall C:\ erhalten.
Nun wechselst Du im Explorer auf C:\Programme.
Dann gibst Du als Adresse Dein Programm an und startest es. Du solltest überall C:\Programme erhalten.

Oder auf einen einfachen Nenner gebracht: Über die Angabe von C: erhälts Du das Verzeichnis, in das die Dein Programm aufrufende Shell zuletzt auf C: gewechselt ist. Dies setzt sich über mehrere voneinander aufgerufene Shells so fort. Ggfls ist dann halt auch mal Delphi die Shell, die Dein Programm aufruft.

Der Hinweis von himitsu aus Post #3 ist durchaus korrekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:07 Uhr.
Seite 1 von 2  1 2      

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