AGB  ·  Datenschutz  ·  Impressum  







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

Shellnamespace und SHBindToParent

Ein Thema von gkoeder · begonnen am 17. Mai 2010
Antwort Antwort
gkoeder

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

Shellnamespace und SHBindToParent

  Alt 17. Mai 2010, 23: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
Antwort Antwort


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 02:18 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