Hallo!
Ich probiere mich derzeit ein wenig am ShellNamespace und möchte eine Funktion schreiben, die mir ausgehend von einem Verzeichnis (definiert als PIDL) das Parentverzeichnis bzw. Parentobjekt zurückliefert. Als Ausgangspunkt habe ich folgende Funktionen geschrieben, die ein Verzeichnis in eine PItemIDList umwandeln bzw. eine PIDL wieder als Pfad darstellen:
Delphi-Quellcode:
Function ConvertPathToPIDL(Path: String): PItemIDList;
var
ShellMalloc: iMalloc;
ShellFolder: iShellFolder;
ParentFolder: iShellFolder;
Eaten, Attributes: uLong;
Begin
Result := NIL;
If Succeeded(SHGetMalloc(ShellMalloc)) Then
Begin
Attributes := 0;
SHGetDesktopFolder(ShellFolder);
if Assigned(ShellFolder) then
ShellFolder.ParseDisplayName(0, NIL, PWideChar(Path), Eaten, Result, Attributes);
End;
End;
function ConvertPidlToPath(IdList: PItemIdList): String;
begin
SetLength(Result, MAX_PATH);
if SHGetPathFromIdList(IdList, PChar(Result)) then
begin
SetLength(Result, StrLen(PChar(Result)));
Result := IncludeTrailingPathDelimiter(Result);
end
else Result := '';
end;
Wenn ich die
MSDN richtig verstanden habe, so kann ich mittels der Funktion SHBindToParent einen Bezug zum IShellFolder.Interface des Parentobjekts herstellen. Leider liegt hier das Problem: Ich bekomme bei SHBindToParent einen kuriosen Wert zurückgeliefert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var
FolderPIDL: PItemIDList;
ParentPIDL: PItemIDList;
ParentIShellFolder: IShellFolder;
Attributes: uLong;
begin
FolderPIDL := ConvertPathToPIDL('c:\temp');
// Gegenprüfung
Memo1.Lines.Add(ConvertPidlToPath(FolderPIDL));
SHBindToParent(FolderPIDL, IID_IShellFolder, Pointer(ParentIShellFolder), ParentPIDL);
// Parent-IShellFolder?
Memo1.Lines.Add(ConvertPidlToPath(ParentPIDL));
end;
Ergebnis:
C:\Temp\
C:\Users\gkoeder\Desktop\Temp\
Eigentlich wollte ich als Ergebnis C:\, also das Parentverzeichnis von C:\Temp\
Hat jemand eine Idee, worin das problem liegen könnte?
Dankeschön!
Viele Grüße,
Gerald