Nun habe ich eine Lösung.
Delphi-Quellcode:
uses
ActiveX, ShlObj, SHDocVw, ComObj;
function PathToPIDL(
const Path:
string): PItemIDList;
const
SFGAO_STREAM = $00400000;
var
Count: ULONG;
Attributes: ULONG;
ShellFolder: IShellFolder;
begin
OleCheck(SHGetDesktopFolder(ShellFolder));
Attributes := SFGAO_FOLDER
or SFGAO_STREAM;
OleCheck(ShellFolder.ParseDisplayName(0,
nil, PWideChar(WideString(Path)), Count, Result, Attributes));
if not ((Attributes
and SFGAO_FOLDER = SFGAO_FOLDER)
and (Attributes
and SFGAO_STREAM <> SFGAO_STREAM))
then
begin
CoTaskMemFree(Result);
raise Exception.Create('
Could not convert string to PIDL');
end;
end;
function PIDLToPath(
const PIDL: PItemIDList):
string;
var
Path:
array[0..Max_Path]
of Char;
begin
if ShGetPathFromIDList(PIDL, Path)
then
Result := Path
else raise Exception.Create('
Could not convert PIDL to string');
end;
procedure TfrmMain.FormCreate(Sender: TObject);
var
s:
string;
PIDL: PItemIDList;
begin
s := '
c:\uSERs\PUBlic\DeskTop';
PIDL := PathToPIDL(s);
s := PIDLToPath(PIDL);
Memo1.Lines.Add(S);
end;
Zitat:
C:\Users\Public\Desktop
Viel Spass damit.
ps: Bearbeite das Uses, kann sein das da zuviel steht.
Hallo, wenn du dich erinnern kannst...
An der Funktion (bzw. an meine Funktion die ich entsprechend für meine Bedürfnisse abgeändert habe <- nachfolgender Code), bin ich gerade noch am rumwerkeln.
Code:
Function PathToCS(Const Path: UnicodeString): UnicodeString;
Var
Count: ULONG;
Attrs: ULONG;
ShellFolder: IShellFolder;
Pa: Array[0..Max_Path] Of Char;
Pidl: PItemIDList;
Begin
Attrs := SFGAO_FOLDER or SFGAO_STREAM;
Count := 0;
If SHGetDesktopFolder(ShellFolder) = S_OK Then
Begin
If ShellFolder.ParseDisplayName(0,Nil,PWideChar(Path),Count,Pidl,Attrs) = S_OK Then
Begin
If SHGetPathFromIDList(Pidl, Pa)
Then Result := IncludeTrailingPathDelimiter(Pa)
Else Result := IncludeTrailingPathDelimiter(Path);
CoTaskMemFree(Pidl);
End Else Result := IncludeTrailingPathDelimiter(Path);
End Else Result := IncludeTrailingPathDelimiter(Path);
End;
Ich probiere nämlich bei langen Verzeichnissen dies auch so zu lösen. Versuche mich an "SHGetPathFromIDListW" (anstatt "SHGetPathFromIDList" (ohne W)). Aber was ich auch mache, sobald mehr als 260 (glaub ich) Zeichen im Pfad sind (z.B. C:\Test\UnterOrdner\Unter\ganzvielunter\...\...\.. .), bekomme ich kurze Pfade zurück geliefert. Also z.B. diese "ICHGEH~1" verkürzten Namen. Hier im Pfad am Anfang "\\?\" anzuhängen klappt erst recht nicht.
Meine Versuche für den 2. Parameter für "SHGetPathFromIDListW":
Code:
Var Pa: PWideChar; // zuvor "Array[0..Max_Path] Of Char;"
const
NTFS_MAX_PATH = 32767;
GetMem(Pa, (NTFS_MAX_PATH + 1) * 2);
If SHGetPathFromIDListW (Pidl, Pa)
...
Aber so geht das einfach nicht.
Vielleicht hast du (oder jemand anderes) eine Idee?
Micha