![]() |
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:
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. |
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:\ |
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: |
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:"
"F:" CD-ROM
"N:" Festplatte
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. |
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. |
Re: C: = C:\Windows\System32
Okay, aber was soll da passieren? Ich habe nichts feststellen können.
|
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. |
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 |
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:
Öffnen Dialog in Delphi öffnen, zu der EXE-Datei springen und diese mir rechterMaustaste -> Öffnen, starten. Da haben wir dieselben Ergebnisse. |
Re: C: = C:\Windows\System32
Hallo,
was passiert denn, wenn Du Dein Programm mal dahingehend änderst:
Delphi-Quellcode:
Ist das Ergebnis unverändert?
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. 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:44 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