Delphi: How to SET(write) extended file properties?

前端 未结 3 748
北荒
北荒 2021-02-10 16:11

I would like to set properties as shown in Windows Explorer File Properties->Summary Tab (Authors, Title, Subject, etc). (In Windows 7 is the Details tab) I already know how to

3条回答
  •  孤城傲影
    2021-02-10 16:49

    function GetFileSummaryInfo(const FileName: WideString): String;
    
    const
    FmtID_SummaryInformation: TGUID =     '{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';
    FMTID_DocSummaryInformation : TGUID = '{D5CDD502-2E9C-101B-9397-08002B2CF9AE}';
    FMTID_UserDefinedProperties : TGUID = '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}';
    IID_IPropertySetStorage : TGUID =     '{0000013A-0000-0000-C000-000000000046}';
    
    const
    STGFMT_FILE = 3; //Indicates that the file must not be a compound file.
                     //This element is only valid when using the StgCreateStorageEx
                     //or StgOpenStorageEx functions to access the NTFS file system
                     //implementation of the IPropertySetStorage interface.
                     //Therefore, these functions return an error if the riid
                     //parameter does not specify the IPropertySetStorage interface,
                     //or if the specified file is not located on an NTFS file system
                     //volume.
    
    STGFMT_ANY = 4; //Indicates that the system will determine the file type and
                    //use the appropriate structured storage or property set
                    //implementation.
                    //This value cannot be used with the StgCreateStorageEx function.
    
    
    // Summary Information
     PID_TITLE        = 2;
     PID_SUBJECT      = 3;
     PID_AUTHOR       = 4;
     PID_KEYWORDS     = 5;
     PID_COMMENTS     = 6;
     PID_TEMPLATE     = 7;
     PID_LASTAUTHOR   = 8;
     PID_REVNUMBER    = 9;
     PID_EDITTIME     = 10;
     PID_LASTPRINTED  = 11;
     PID_CREATE_DTM   = 12;
     PID_LASTSAVE_DTM = 13;
     PID_PAGECOUNT    = 14;
     PID_WORDCOUNT    = 15;
     PID_CHARCOUNT    = 16;
     PID_THUMBNAIL    = 17;
     PID_APPNAME      = 18;
     PID_SECURITY     = 19;
    
     // Document Summary Information
     PID_CATEGORY     = 2;
     PID_PRESFORMAT   = 3;
     PID_BYTECOUNT    = 4;
     PID_LINECOUNT    = 5;
     PID_PARCOUNT     = 6;
     PID_SLIDECOUNT   = 7;
     PID_NOTECOUNT    = 8;
     PID_HIDDENCOUNT  = 9;
     PID_MMCLIPCOUNT  = 10;
     PID_SCALE        = 11;
     PID_HEADINGPAIR  = 12;
     PID_DOCPARTS     = 13;
     PID_MANAGER      = 14;
     PID_COMPANY      = 15;
     PID_LINKSDIRTY   = 16;
     PID_CHARCOUNT2   = 17;
    
    var
     I: Integer;
     PropSetStg: IPropertySetStorage;
     PropSpec: array of TPropSpec;
     PropStg: IPropertyStorage;
     PropVariant: array of TPropVariant;
     Rslt: HResult;
     S: String;
     Stg: IStorage;
     PropEnum: IEnumSTATPROPSTG;
     HR : HResult;
     PropStat: STATPROPSTG;
     k : integer;
    
    function PropertyPIDToCaption(const ePID: Cardinal): string;
    begin
     case ePID of
       PID_TITLE:
         Result := 'Title';
       PID_SUBJECT:
         Result := 'Subject';
       PID_AUTHOR:
         Result := 'Author';
       PID_KEYWORDS:
         Result := 'Keywords';
       PID_COMMENTS:
         Result := 'Comments';
       PID_TEMPLATE:
         Result := 'Template';
       PID_LASTAUTHOR:
         Result := 'Last Saved By';
       PID_REVNUMBER:
         Result := 'Revision Number';
       PID_EDITTIME:
         Result := 'Total Editing Time';
       PID_LASTPRINTED:
         Result := 'Last Printed';
       PID_CREATE_DTM:
         Result := 'Create Time/Date';
       PID_LASTSAVE_DTM:
         Result := 'Last Saved Time/Date';
       PID_PAGECOUNT:
         Result := 'Number of Pages';
       PID_WORDCOUNT:
         Result := 'Number of Words';
       PID_CHARCOUNT:
         Result := 'Number of Characters';
       PID_THUMBNAIL:
         Result := 'Thumbnail';
       PID_APPNAME:
         Result := 'Creating Application';
       PID_SECURITY:
         Result := 'Security';
       else
         Result := '$' + IntToHex(ePID, 8);
       end
    end;
    
    begin
     Result := '';
    try
     OleCheck(StgOpenStorageEx(PWideChar(FileName),
     STGM_READ or STGM_SHARE_DENY_WRITE,
     STGFMT_FILE,
     0, nil,  nil, @IID_IPropertySetStorage, stg));
    
     PropSetStg := Stg as IPropertySetStorage;
    
     OleCheck(PropSetStg.Open(FmtID_SummaryInformation,
        STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg));
    
     OleCheck(PropStg.Enum(PropEnum));
     I := 0;
    
     hr := PropEnum.Next(1, PropStat, nil);
      while hr = S_OK do
      begin
        inc(I);
        SetLength(PropSpec,I);
        PropSpec[i-1].ulKind := PRSPEC_PROPID;
        PropSpec[i-1].propid := PropStat.propid;
        hr := PropEnum.Next(1, PropStat, nil);
     end;
    
     SetLength(PropVariant,i);
     Rslt := PropStg.ReadMultiple(i, @PropSpec[0], @PropVariant[0]);
    
     if Rslt =  S_FALSE then Exit;
    
     for k := 0 to i -1 do
      begin
        S := '';
        if PropVariant[k].vt = VT_LPSTR then
          if Assigned(PropVariant[k].pszVal) then
           S := PropVariant[k].pszVal;
    
        S := Format(PropertyPIDToCaption(PropSpec[k].Propid)+ ' %s',[s]);
       if S <> '' then Result := Result + S + #13;
     end;
     finally
     end;
    

    for more http://www.delphi-central.com/tutorials/File_Summary_Info.aspx. Also this : http://www.swissdelphicenter.ch/torry/showcode.php?id=1614 show you how to manipulate [IPropertyStorage]

提交回复
热议问题