Einzelnen Beitrag anzeigen

gkoeder

Registriert seit: 15. Jun 2004
84 Beiträge
 
Delphi 2010 Professional
 
#1

Shellnamespace und SHBindToParent

  Alt 17. Mai 2010, 22:16
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
  Mit Zitat antworten Zitat