AGB  ·  Datenschutz  ·  Impressum  







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

PIDL und der Font-Ordner - geht nicht

Ein Thema von MicMic · begonnen am 11. Mär 2020 · letzter Beitrag vom 16. Mär 2020
Antwort Antwort
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: PIDL und der Font-Ordner - geht nicht

  Alt 12. Mär 2020, 12:14
Danke für die Mühe
Wie du siehst, ganz und gar nicht einfach zu lösen.
Naja, einfach ist es, wenn man weiß wie *lach

Für "ParseDisplayName" ist ja noch beschrieben (mit Google Übersetzer):

LPWSTR
Da jeder Shell-Ordner seine eigene Analysesyntax definiert, kann die Form, die diese Zeichenfolge annehmen kann, variieren.

Unter Bemerkungen noch:
Einige Shell-Ordner implementieren möglicherweise nicht IShellFolder : ParseDisplayName. Jeder Ordner, der dies tut, definiert seine eigene Analysesyntax.

Hört sich irgendwie an, als ob man da mit dem Parameter "IBindCtx" was machen muss?

Eines habe ich mal getestet:
Anstatt "C:\Windows\Fonts\fontname.ttf" habe ich "\\COMPUTERNAME\Windows\Fonts\fontname.ttf" genommen. Der erste Zugriff dauert lange (wegen dem Computernamen) aber danach macht "ParseDisplayName" oder auch "ILCreateFromPath" keine Bremse mehr. Ist jetzt zwar auch nicht die Lösung, da weiterhin kein PIDL erzeugt wird und "ParseDisplayName" z.B. hier auch "E_INVALIDARG" zurück liefert.

Das Problem werden wohl viele haben, die mit PIdl/SHGetFileInfo etc. arbeiten. Aber es nicht unbedingt merken. Wer kommt schon auf die Idee, dass manche Dateizugriffe in speziellen Verzeichnissen Probleme machen, wenn es sonst fast überall funktioniert. Doofe Sache aber auch *schnief*
  Mit Zitat antworten Zitat
Alt 12. Mär 2020, 20:15     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: PIDL und der Font-Ordner - geht nicht

  Alt 12. Mär 2020, 20:56
Was genau möchtest du vom Font-Ordner und einer beliebigen Font-Datei wissen?
Es geht weniger um den Font-Ordner. Eher geht's darum, dass ich diesen Inhalt genauso verarbeiten kann, wie andere Ordner auch. Und dazu brauche ich eigentlich ne PIDL zu den einzelnen Dateien in diesem Ordner. Es müssen dort ja nicht unbedingt nur Schriftdateien vorhanden sein. Jeder Benutzer kann hier alle mögliche Dateien ablegen. Deshalb muss ich diesen Ordner ganz normal betrachten und je nach Anwendung/Zweck normale Dateioperationen durchführen können. Mal ein Dateistatus, mal ein Symbol, mal zusätzliche Overlays, zusätzliche Dateiinfos... nicht Dateityp bezogen. Was inzwischen auch kein Problem ist, wenn es sich um ein normalen Ordner handelt. Aber auch der Ordner "Downloaded Program Files" im Windows Verzeichnis verhält sich genauso. Bestimmt gibt es noch weitere Ordner (noch nicht weiter nachgeschaut) die ne Extrawurst benötigen.

Der Explorer selbst behandelt die beiden genannten Ordner auch etwas anders. Im Font-Ordner kann z.B. zu einer Datei kein Eigenschafts-Dialog angezeigt werden und im "Downloaded Program Files" werden vom Explorer keine Inhalte (Dateien) angezeigt, auch wenn Dateien extern (mit anderer Software) dort hineinkopiert worden sind.

Wenn's virtuelle Ordner wären und hier Windows sein Ding macht, würde ich es ja verstehen aber es sind doch ganz normale Verzeichnisse.
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: PIDL und der Font-Ordner - geht nicht

  Alt 12. Mär 2020, 22:15
Wenn ich nicht gerade falsch schauen, hab ich's hinbekommen.
Also hier (noch nicht verschönert/optimiert usw):
Delphi-Quellcode:
function PathToPIDL(APath: WideString;FA:Cardinal): PItemIDList;
var
  Desktop: IShellFolder;
  pchEaten, dwAttributes: ULONG;
  kk : hresult;
  pbc : IBindCtx;
  w32fd : TWin32FindData;
  ifs : TFileSystemBindData;
  r : HResult;
begin
  Result := nil;
  SHGetDesktopFolder(Desktop);
  dwAttributes := 0;
  ZeroMemory(@w32fd, Sizeof(TWin32FindData));
             w32fd.dwFileAttributes := FA;
             ifs := TFileSystemBindData.Create;
             ifs.SetFindData(w32fd);
             r := CreateBindCtx(0, pbc);
             r := pbc.RegisterObjectParam(STR_FILE_SYS_BIND_DATA, ifs);
  if Assigned(Desktop) then
  begin
     kk:= Desktop.ParseDisplayName(0, pbc, PWideChar(APath), pchEaten, Result, dwAttributes);
     if kk <> NOERROR then
    begin
      Result := nil;
      f.Caption := APath+' '+inttostr(kk);
    end
  end
end;
Ich übergebe Pfad+Datei + Dateiattribute der Datei.
Was ich da mache, ist mir nicht so ganz klar (noch nicht) aber habe aus dem Netz was zu diesem "IBindCtx" gefunden und dachte mir, ich probiere das mal aus. So scheint es wohl zu funktionieren und ich messe keine Bremse. Na bestimmt entdecke ich wieder andere Probleme *lol … mal schauen.

Jedoch kann ich mit diesem PIDL nicht auf SFGAO_LINK prüfen. SFGAO_SHARE geht dann wiederum (z.B. Ordner C:\Users).

Hier dazu zwei Funktionen, die recht ähnlich sind. Warum geht SFGAO_SHARE und SFGAO_LINK nicht?
Delphi-Quellcode:
function IsShare(aPIDL: PItemIDList): Boolean;
var
  Attrs: DWord;
  ItemIDList: PItemIDList;
  ShellFolder: IShellFolder;
begin
  Result := False;
  if fjShareOverlay = False then Exit;
  if Succeeded(SHBindToParent(aPidl, IID_IShellFolder, Pointer(ShellFolder), ItemIDList)) then
  begin
    attrs := SFGAO_SHARE;
    ShellFolder.GetAttributesOf(1, ItemIDList, Attrs);
    if Attrs and SFGAO_SHARE <> 0 then result := true else result := false;
  end else result := false;
end;

function IsLink(aPIDL: PItemIDList): Boolean;
var
  Attrs: DWord;
  ItemIDList: PItemIDList;
  ShellFolder: IShellFolder;
begin
  Result := False;
  if fjLinkOverlay = False then Exit;
  if Succeeded(SHBindToParent(aPidl, IID_IShellFolder, Pointer(ShellFolder), ItemIDList)) then
  begin
    attrs := SFGAO_LINK;
    ShellFolder.GetAttributesOf(1, ItemIDList, Attrs);
    if Attrs and SFGAO_LINK <> 0 then result := true else result := false;
  end else result := false;
end;
Für SFGAO_LINK kann ich stattdessen auf das Attribut "FILE_ATTRIBUTE_REPARSE_POINT" (TWin32FindData.dwFileAttributes) prüfen. Trotzdem verstehe ich noch nicht, warum die Funktion "IsLink" mit dem neuen PIDL nicht geht.
  Mit Zitat antworten Zitat
Alt 13. Mär 2020, 01:48     Erstellt von Frühlingsrolle
Dieser Beitrag wurde von Daniel gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: PIDL und der Font-Ordner - geht nicht

  Alt 13. Mär 2020, 07:08
Ich bin dem Problem einen Schritt näher gekommen indem ich mir einen auf PIDL's basierten Explorer nachgebastelt habe.
Das "Geheimnis" ist, das im Fonts Ordner abgelegte Dateien von Windows anders angesprochen werden.
Mein Anhang sagt mehr als tausend Worte, wie man allerdings von den Objekten wiederum einen Dateinamen zaubert bleibt mir noch verborgen.

Nun zu Deinem Eigenschaften-Dialog, hier ist ein getesteter Kode der den Standard Windows Eigenschaften Dialog provoziert.

Delphi-Quellcode:
procedure PropertiesDialog(const Path: string); overload;
var
  SEI: TShellExecuteInfo;
begin
  FillChar(SEI, SizeOf(SEI), 0);
  SEI.cbSize := SizeOf(SEI);
  SEI.lpFile := PChar(Path);
  SEI.lpVerb := 'properties';
  SEI.fMask := SEE_MASK_INVOKEIDLIST;
  ShellExecuteEx(@SEI);
end;

procedure PropertiesDialog(const PIDL: PItemIDList); overload;
var
  SEI: TShellExecuteInfo;
  Path: array[0..MAX_PATH - 1] of WideChar;
begin
  if SHGetPathFromIDList(PIDL, @Path) then
    begin
      FillChar(SEI, SizeOf(SEI), 0);
      SEI.cbSize := SizeOf(SEI);
      SEI.lpFile := PChar(String(Path));
      SEI.lpVerb := 'properties';
      SEI.fMask := SEE_MASK_INVOKEIDLIST;
      ShellExecuteEx(@SEI);
    end;
end;
Angehängte Grafiken
Dateityp: png Screenshot - 12_03.png (15,4 KB, 23x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: PIDL und der Font-Ordner - geht nicht

  Alt 13. Mär 2020, 11:42
@KodeZwerg
Ja, dass Explorer den Ordner anders listet, sah ich schon.
Dennoch ist es ja ein normaler Ordner auf der Festplatte.

Hast du mein Beitrag gelesen, wegen "IBindCtx". Es geh nun erst mal ohne Bremse.
Ein Eigenschaftsdialog war mir bis jetzt, hier in diesem Fall noch nicht so wichtig. Erst mal das eine nach dem anderen lösen aber danke... wenn's damit geht, ist's ja super. Dein "PropertiesDialog" werde ich mal am WE ausprobieren.

@Frühlingsrolle
Danke für den Link. Ich lese ja auch und viel, wenn's Schwierigkeiten irgendwo gibt. Trotzdem ist's nicht immer gleich ersichtlich oder auch kompliziert wenn man irgendwo eine Hürde hat. Auch sind nicht alle Dokus immer ganz durchdacht, sprich der eine schreibt vom anderen ab usw.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: PIDL und der Font-Ordner - geht nicht

  Alt 13. Mär 2020, 12:16
Hast du mein Beitrag gelesen, wegen "IBindCtx".
Nein, aber...
werde ich mal am WE ausprobieren.
dito
@Frühlingsrolle
Danke für den Link.
Dem schließe ich mich an!
Dein "PropertiesDialog" .... wenn's damit geht, ist's ja super
Läuft, habs nur gepostet weil Du's schon mehrmal erwähnt hast ;D
/edit
Läuft nur wenn das Objekt einen "normalen" Pfad oder Dateinamen hat, bei PIDL's ist's wieder so eine Sache, wie das Bild von mir zeigte... dann gibt's ja auch noch die PIDL's wo durch den Namespace die Dateiendung abgeschnitten wird.... also sollte man vorher mit "Folder/File Exists()" sicherstellen das da was gültiges reinkommt.

Ein Corona freies Wochenende wünsche ich \(^o^)/
Gruß vom KodeZwerg

Geändert von KodeZwerg (13. Mär 2020 um 12:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: PIDL und der Font-Ordner - geht nicht

  Alt 16. Mär 2020, 07:35
Ich musst mir erstmal rausfinden was TFileSystemBindData ist
Von zarko-gajic.iz.hr dort hab ich mir mal was angeschaut.
Abgeschreckt hat mich ja das ein Reserviertes Feld dafür "missbraucht" wird aber wenn es funktioniert

/edit
ps: das bei mir der dateiname in was anderes umgemodelt wurde konnte ich auch fixen, sowie die möglichkeit alle dateien (inklusive hidden/system attribute)
jetzt muss nur noch 'ne logik her das reparse points und zip dateien anders behandelt werden.
Gruß vom KodeZwerg

Geändert von KodeZwerg (16. Mär 2020 um 07:46 Uhr)
  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 13:06 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