![]() |
Nicht ExtractShortPathName
Ich verwenden folgende function. Diese liefert unter XP jedoch den ExtractShortPathName zurück.
Delphi-Quellcode:
Ich suche nach einer Möglichkeit, den "normalen" Pfadnamen zu erhalten?
class function TUtils.GetTempDir: string;
begin SetLength(Result, MAX_PATH); GetTempPath(Length(Result), PChar(Result)); SetLength(Result, StrLen(PChar(Result))); if (Result <> '') then Result := IncludeTrailingPathDelimiter(Result); end; |
AW: Nicht ExtractShortPathName
Da es bei mit nicht passiert, allgemein ...
Delphi-Quellcode:
var
dest:String; begin SetLength(dest,MAX_PATH); GetLongPathName(Pchar(ExtractShortPathName('C:\Users\Bummi\Documents\Integration Services Script Component')),@Dest[1],LEngth(Dest)); Showmessage(dest); end; |
AW: Nicht ExtractShortPathName
Wozu muß es denn unbedingt der Lange sein?
Den Kurzen kann man ja genau so gut verwenden. Tipp: Du hast die Quellcodes, bzw. du kannst deinen Debugger nutzen, um nachzusehn was sich in ![]() Und mit diesem ![]() ![]() Als Tipp für die Anderen: ![]() |
AW: Nicht ExtractShortPathName
Zitat:
Ich muß jetzt los, bevor die Jungs vom Waldhof die Stadt stürmen (DSchlaaaaaaaaaaaaaand) Gruß Tho |
AW: Nicht ExtractShortPathName
Na ja, man kann Windows sagen, dass es neben den langen Pfaden nicht noch zusätzlich die kurzen speichert. Mit den langen wäre man auf der Sicheren Seite.
|
AW: Nicht ExtractShortPathName
Wenn man den Kurzen bekommt, dann existiert der aber auch, denn irgendwo muß Windows den ja her haben, um ihn dir sagen zu können. :wink:
Auch wenn man es "standardmäßig" deaktiviert, ist es immernoch möglich und wird auch genutzt, wenn nötig. z.B. die alte ANSI-APIs erstellen sowas, wenn der Dateiname nicht ins ANSI passt, sobald man sie benutzt. |
AW: Nicht ExtractShortPathName
Das ist eben die Frage, was Windows zurückliefert, wenn man die kurzen Dateinamen deaktiviert haben. Und das hat nichts mit den Ansi-APIs zu tun.
|
AW: Nicht ExtractShortPathName
Sicher daß der Kurza nicht im Notfall erstellt wird?
Wäre doch irgendwie ein problematisch, wenn dann Dateien nicht mehr gefunden würden. :shock: |
AW: Nicht ExtractShortPathName
Na ja, aber merken müsste ihn sich Windows ja wieder, damit es nicht versehentlich eine andere Datei den gleichen kurzen Namen gibt. Aber du hast es Windows ja verboten, den klurzen zu speichern.
|
AW: Nicht ExtractShortPathName
Hmm, ich hätte es eher so verstanden, daß es nur "standardmäßig" nicht immer sofort den Kurzen anlegt.
Daß er nicht angelegt und gespeichert würde wird, wenn er nötig ist ... davon steht nichts. Das sollte doch wie die DateiIDs sein. Man kann ja irgendwie Dateien eine ID verpassen können, über welche man die Datei finden könnte ... optional, aber nicht immer nötig. Auch bleiben ja alle kurzen Namen erhalten, welche dem Ausschalten dieser Funktion schon vorhanden waren, also wird es dennoch weiterhin unterstützt. Da man Windows erst installieren muß, um es dann über die Registry zu deaktivieren, sollte der Temppfad da auch schon existieren. :stupid: [edit] Wollte bissl damit Rumspielenpropieren, aber außer den Debugrechten braucht man wohl noch mehr. :gruebel:
Delphi-Quellcode:
function EnableProcessPrivilege(const Privilege: string; Enable: Boolean = True): Boolean;
var Token: THandle; ReturnLen: LongWord; TokenPriv: TTokenPrivileges; begin Result := False; if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token) then try TokenPriv.PrivilegeCount := 1; TokenPriv.Privileges[0].Attributes := IfThen(Enable, SE_PRIVILEGE_ENABLED, 0); Result := LookupPrivilegeValue(nil, PChar(Privilege), TokenPriv.Privileges[0].Luid) and AdjustTokenPrivileges(Token, False, TokenPriv, SizeOf(TokenPriv), nil, ReturnLen); finally CloseHandle(Token); end; end; function EnableThreadPrivilege(const Privilege: string; Enable: Boolean = True): Boolean; var Token: THandle; ReturnLen: LongWord; TokenPriv: TTokenPrivileges; begin Result := False; if OpenThreadToken(GetCurrentThread, TOKEN_ADJUST_PRIVILEGES, False, Token) or ((GetLastError = ERROR_NO_TOKEN) and OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, Token)) then try TokenPriv.PrivilegeCount := 1; TokenPriv.Privileges[0].Attributes := IfThen(Enable, SE_PRIVILEGE_ENABLED, 0); Result := LookupPrivilegeValue(nil, PChar(Privilege), TokenPriv.Privileges[0].Luid) and AdjustTokenPrivileges(Token, False, TokenPriv, SizeOf(TokenPriv), nil, ReturnLen); finally CloseHandle(Token); end; end; procedure TForm4.Button1Click(Sender: TObject); var Testfile: String; Handle, FindHandle: THandle; FindData: TWIN32FindData; SetFileShortName: function(hFile: THandle; lpShortName: PChar): LongBool; stdcall; begin SetFileShortName := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'SetFileShortNameW'); Testfile := ExtractFilePath(ParamStr(0)) + 'abgfdsarv'#12345'.txt'; //if not EnableProcessPrivilege('SeDebugPrivilege') then // RaiseLastOSError; if not EnableProcessPrivilege('SeRestorePrivilege') then RaiseLastOSError; Handle := CreateFile(PChar(Testfile), GENERIC_ALL, FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_FLAG_BACKUP_SEMANTICS, 0); if Handle = INVALID_HANDLE_VALUE then RaiseLastOSError; try FindHandle := FindFirstFile(PChar(Testfile), FindData); if FindHandle = INVALID_HANDLE_VALUE then RaiseLastOSError; Winapi.Windows.FindClose(FindHandle); OutputDebugString(PChar(String(FindData.cAlternateFileName))); if not SetFileShortName(Handle, 'abgfd~13.txt') then RaiseLastOSError; FindHandle := FindFirstFile(PChar(Testfile), FindData); if FindHandle = INVALID_HANDLE_VALUE then RaiseLastOSError; Winapi.Windows.FindClose(FindHandle); OutputDebugString(PChar(String(FindData.cAlternateFileName))); if not SetFileShortName(Handle, 'abgfds~1.txt') then RaiseLastOSError; FindHandle := FindFirstFile(PChar(Testfile), FindData); if FindHandle = INVALID_HANDLE_VALUE then RaiseLastOSError; Winapi.Windows.FindClose(FindHandle); OutputDebugString(PChar(String(FindData.cAlternateFileName))); if not SetFileShortName(Handle, nil) then RaiseLastOSError; FindHandle := FindFirstFile(PChar(Testfile), FindData); if FindHandle = INVALID_HANDLE_VALUE then RaiseLastOSError; Winapi.Windows.FindClose(FindHandle); OutputDebugString(PChar(String(FindData.cAlternateFileName))); finally CloseHandle(Handle); if not DeleteFile(PChar(Testfile)) then RaiseLastOSError; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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