AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C: = C:\Windows\System32

Ein Thema von Dezipaitor · begonnen am 13. Feb 2009 · letzter Beitrag vom 13. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#1

C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:22
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.
Angehängte Dateien
Dateityp: dpr test_189.dpr (1,9 KB, 7x aufgerufen)
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:28
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:\
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:30
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
$2B or not $2B
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:32
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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:34
Sag ich doch
laßt mal das Programm aktiv ... öffnet 'nen FileOpen-Dialog, spielt dort etwas rum und schaut mal was mit dem Verzeichnis passiert.
$2B or not $2B
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:40
Okay, aber was soll da passieren? Ich habe nichts feststellen können.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#7

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 13:44
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 14:13
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#9

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 14:32
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 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.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: C: = C:\Windows\System32

  Alt 13. Feb 2009, 14:37
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 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