Hallo
Ich probiere mich hin und her. Aber es geht noch nicht so richtig.
Delphi-Quellcode:
Function StrToPIDL(AP,FN:String; DD:TWIN32FindDataW): PItemIDList;
Var
Desktop: IShellFolder;
PChEaten, DWAttributes: ULONG;
Pbc : IBindCtx;
Ifs : TFileSystemBindData;
R : HResult;
Begin
Result := Nil;
If Succeeded(SHGetDesktopFolder(Desktop)) Then
Begin
DWAttributes := 0;
PChEaten := 0;
Ifs := TFileSystemBindData.Create;
Ifs.SetFindData(dd);
If CreateBindCtx(0,Pbc) = S_OK Then
Begin
If Pbc.RegisterObjectParam(STR_FILE_SYS_BIND_DATA,Ifs) = S_OK Then
Begin
R := Desktop.ParseDisplayName(0,Pbc,PWideChar(AP+FN),PChEaten,Result,DWAttributes);
If R <> S_OK Then
Begin
f.Caption := 'FEHLER '+inttostr(length(ap+fn)); // ab 520 Zeichen kommt das mit einem Netzwerk-Pfad
Result := Nil;
End;
End Else Result := Nil;
End Else Result := Nil;
End Else Result := Nil;
End;
Lokal geht alles wunderbar. Auch mit sehr langen Verzeichnissen und Dateinamen. Aber mit "\\RECHNER\Freigabe\......." gibt es zwei Probleme.
Also der Aufruf ist jedenfalls folgender:
Delphi-Quellcode:
// PA=Pfad
// FN=Dateiname
// DD=TWIN32FindDataW
PIDL := StrToPIDL(PA,FN,D);
ZeroMemory(@Info, SizeOf(TSHFileInfoW));
SHGetFileInfoW(PWideChar(PIDL),0,Info,SizeOf(TSHFileInfoW),SHGFI_SYSICONINDEX Or SHGFI_PIDL);
I1 := Info.iIcon; // Icon Index
Ab 260 Zeichen bekomme ich zwar noch ein PIDL aber wohl ein falscher. Denn ab hier stimmt Icon Index nicht mehr (Problem1). Und wie schon als Kommentar in der Funktion beschrieben, wird ab 520 kein PIDL mehr zugewiesen (Problem2). Das sind dann ja 2x260. Der rechnet wohl CreateBindCtx (DD.cFileName)+PA+FN dann zusammen? Aber ParseDisplayName hat doch keine MAX_PATH Einschränkung. Es geht ja auch Lokal. Nur leider nicht im Netzwerk und hier scheint dann doch was mit MAX_PATH zu laufen.
Info: Die Angabe von "\\?\
UNC\" geht hier dann erst recht nicht.
Hat jemand eine Idee, wie man das mit dem Netzwerk-Pfaden lösen kann? Ich brauche halt für "SHGetFileInfoW" das PIDL.