已知一个文件夹或者文件
比如:C:\WINDOWS 或者
C:\WINDOWS\system32\mplay32.exe
得到其项目标示符列表pidl;

解决方案 »

  1.   


    function PathToPidlBind(const FileName: string; out Folder: IShellFolder):
      PItemIdList;
    var
      Attr, Eaten: ULONG;
      PathIdList: PItemIdList;
      DesktopFolder: IShellFolder;
      Path, ItemName: pwidechar;
      s1,s2: string;
      k: integer;
    begin
      Result := nil;
      
      s1:= ExtractFilePath(FileName);
      s2:= ExtractFileName(FileName);
      Path:= a2u(s1);
      ItemName:= a2u(s2);  if Succeeded(SHGetDesktopFolder(DesktopFolder)) then begin
        if Succeeded(DesktopFolder.ParseDisplayName(0, nil, Path, Eaten, PathIdList, Attr)) then begin // FAIL
          if Succeeded(DesktopFolder.BindToObject(PathIdList, nil, IID_IShellFolder, Pointer(Folder))) then begin
            if FAILED(Folder.ParseDisplayName(0, nil, ItemName, Eaten, Result, Attr)) then begin
              Folder := nil;
              Result := DriveToPidlBind(FileName, Folder);
            end;
          end;
          PidlFree(PathIdList);
        end
        else
          Result := DriveToPidlBind(FileName, Folder);
      end;  FreeMem(Path);
      FreeMem(ItemName);
    end;