<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115495&amp;view=findpost&amp;p=863293</guid>
        <pubDate>Thu, 22 Sep 2005 06:47:55 +0000</pubDate>
        <title>как извлечь &amp;quot;Сводку&amp;quot; свойств файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115495&amp;view=findpost&amp;p=863293</link>
        <description><![CDATA[Krid: Ниже показан пример получения набора свойств файла (которые отображаются на вкладке &quot;Сводка&quot; диалогового окна &quot;Свойства:&quot;). <br>
В файловой системе NTFS читаются свойства любого файла (если они вообще есть, конечно). В других ФС читаются свойства только compound-файлов (они же structured storage, т.е. файлы хранения структурированной информации, такие как файлы MS Office, пакеты MSI, etc.), т.к. в этом случае вся информация о свойствах находится в самих файлах (опять же, она может там и отсутствовать). Ну и, естественно, не читаются нестандартные свойства, т.к. они нигде не хранятся, а динамически добавляются на вкладку соответствующим файлу COM-сервером - обработчиком вкладок свойств (PropertySheetHandlers).<br>
<br>
В этом примере считывается несколько св-в из набора SummaryInformation.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit Unit1;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,</div><div class="code_line">&nbsp;&nbsp;Dialogs, StdCtrls, ComCtrls;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TForm1 = class(TForm)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Button1: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ListView1: TListView;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OpenDialog1: TOpenDialog;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure Button1Click(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure FormCreate(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Private declarations }</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ Public declarations }</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Form1: TForm1;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">uses ActiveX, ComObj;</div><div class="code_line">&nbsp;</div><div class="code_line">function StgOpenStorageEx(const pwcsName : POleStr; grfMode : LongInt; stgfmt : DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; grfAttrs : DWORD; &nbsp;pStgOptions : Pointer; reserved2 : Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;riid : PGUID; out stgOpen : IStorage ) : HResult; stdcall; external &#39;ole32.dll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">// GUID&#39;ы для набора св-в SummaryInformation</div><div class="code_line">&nbsp;FMTID_SummaryInformation &nbsp;: TGUID = &#39;{F29F85E0-4FF9-1068-AB91-08002B27B3D9}&#39;;</div><div class="code_line">&nbsp;IID_IPropertySetStorage &nbsp; : TGUID = &#39;{0000013A-0000-0000-C000-000000000046}&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;STGFMT_FILE = 3;</div><div class="code_line">&nbsp;&nbsp;STGFMT_ANY = 4;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;PPropSpecArray=^TPropSpecArray; &nbsp;// массив спецификаций св-в</div><div class="code_line">&nbsp;TPropSpecArray=array[0..999] of TPropSpec; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;PPropVariantArray=^TPropVariantArray; // массив - приемник, куда будут помещены значения нужных св-в</div><div class="code_line">&nbsp;TPropVariantArray=array[0..999] of TPropVariant;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// вспомогательные ф-ции &nbsp;*******</div><div class="code_line">&nbsp;</div><div class="code_line">function IsNTFS(AFileName : string) : boolean;</div><div class="code_line">var</div><div class="code_line">&nbsp;fso, drv : OleVariant;</div><div class="code_line">begin</div><div class="code_line">&nbsp;fso := CreateOleObject(&#39;Scripting.FileSystemObject&#39;);</div><div class="code_line">&nbsp;drv := fso.GetDrive(fso.GetDriveName(AFileName));</div><div class="code_line">&nbsp;Result:=drv.FileSystem = &#39;NTFS&#39;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function FileTimeToLocalSystemTime(ft:FILETIME):TSystemTime;</div><div class="code_line">var</div><div class="code_line">&nbsp;t:FILETIME;</div><div class="code_line">begin</div><div class="code_line">&nbsp;FileTimeToLocalFileTime(ft,t);</div><div class="code_line">&nbsp;FileTimeToSystemTime(t,result);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function SysTimeToStr(ST : TSystemTime):string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;SetLength(result,15);</div><div class="code_line">&nbsp;GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,nil,@result[1],15);</div><div class="code_line">&nbsp;SetLength(result, LStrLen(@result[1]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function SysDateToStr(ST : TSystemTime) : string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;SetLength(Result, 255);</div><div class="code_line">&nbsp;GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, @ST, nil, @result[1], 255);</div><div class="code_line">&nbsp;SetLength(Result, LStrLen(@result[1]));</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function SysDateTimeToStr(ST:TSystemTime):string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;result:=SysDateToStr(ST)+&#39; &#39;+SysTimeToStr(ST)</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// *******</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;stgRoot:IStorage;</div><div class="code_line">&nbsp;stgPS:IPropertySetStorage;</div><div class="code_line">&nbsp;stgP:IPropertyStorage;</div><div class="code_line">&nbsp;ps:PPropSpecArray;</div><div class="code_line">&nbsp;pv:PPropVariantArray;</div><div class="code_line">&nbsp;lit:TListItem; &nbsp;// значения св-в записываем в ListView</div><div class="code_line">begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if (not OpenDialog1.Execute) then exit; &nbsp;// выбираем файл</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;// Проверяем: если это не compound file и система - не NTFS, тогда выходим.</div><div class="code_line">&nbsp;// (для compound файлов FS не важна)</div><div class="code_line">&nbsp;if (StgIsStorageFile(StringToOleStr(OpenDialog1.FileName))&#60;&#62;S_OK) then</div><div class="code_line">&nbsp;&nbsp;if (not IsNTFS(OpenDialog1.FileName)) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; MessageBox(Handle,&#39;NTFS needed for non-compound files&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp; exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ListView1.Clear;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if (StgOpenStorageEx(StringToOleStr(OpenDialog1.FileName), STGM_READ or STGM_SHARE_DENY_WRITE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STGFMT_ANY, 0, nil, &nbsp;nil, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; @IID_IPropertySetStorage, stgRoot)&#60;&#62;S_OK) then &nbsp;// открываем файл</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; MessageBox(Handle,&#39;Can not open file&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp; exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;stgPS:=stgRoot as IPropertySetStorage; &nbsp;// ссылаемся на нужный интерфейс</div><div class="code_line">&nbsp;if (stgPS.Open(FMTID_SummaryInformation,STGM_READ or STGM_SHARE_EXCLUSIVE,stgP)&#60;&#62;S_OK) then // открываем набор св-в</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;MessageBox(Handle,&#39;Can not open property set&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp;exit;</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;ps:=nil;</div><div class="code_line">&nbsp;pv:=nil;</div><div class="code_line">&nbsp;try</div><div class="code_line">&nbsp;&nbsp; GetMem(ps,SizeOf(TPropSpec));</div><div class="code_line">&nbsp;&nbsp; GetMem(pv,SizeOf(TPropVariant));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].ulKind:=PRSPEC_PROPID; &nbsp; // считываем св-ва по их идентификатору (см. ActiveX.pas)</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Прочитаем несколько св-в файла.</div><div class="code_line">// &nbsp;В этом примере - для наглядности - читаем по одному св-ву из потока (можно за один раз прочитать и больше),</div><div class="code_line">// &nbsp;поэтому каждый раз значение будет лежать в pv[0].</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_TITLE; &nbsp; &nbsp; // заголовок</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Title&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then &nbsp;// читаем св-во</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(pv[0].pszVal) // добавляем в ListView</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_SUBJECT; &nbsp; // тема</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Subject&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(pv[0].pszVal)</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_AUTHOR; &nbsp; // автор</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Author&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(pv[0].pszVal)</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_COMMENTS; // комментарий</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Comment&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(pv[0].pszVal)</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_REVNUMBER; // номер редакции</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Revision&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(pv[0].pszVal)</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_APPNAME; &nbsp; // приложение, создавшее пакет</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Application&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(pv[0].pszVal)</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_CREATE_DTM; &nbsp; // Дата создания</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Creation date&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(SysDateTimeToStr(FileTimeToLocalSystemTime(pv[0].filetime)))</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ps[0].propid:=PIDSI_WORDCOUNT; // кол-во слов в документе</div><div class="code_line">&nbsp;&nbsp; lit:=ListView1.Items.Add;</div><div class="code_line">&nbsp;&nbsp; lit.Caption:=&#39;Word count&#39;;</div><div class="code_line">&nbsp;&nbsp; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then</div><div class="code_line">&nbsp;&nbsp; lit.SubItems.Add(IntToStr(pv[0].lVal))</div><div class="code_line">&nbsp;&nbsp; else lit.SubItems.Add(&#39;&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; if assigned(ps) then FreeMem(ps);</div><div class="code_line">&nbsp;&nbsp; if assigned(pv) then FreeMem(pv);</div><div class="code_line">&nbsp;&nbsp; stgP:=nil;</div><div class="code_line">&nbsp;&nbsp; stgPS:=nil;</div><div class="code_line">&nbsp;&nbsp; stgRoot:=nil;</div><div class="code_line">&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;// добавим в список 2 столбца (лучше это делать в дизайнере)</div><div class="code_line">&nbsp;ListView1.ViewStyle:=vsReport;</div><div class="code_line">&nbsp;ListView1.Columns.Add.Caption:=&#39;Name&#39;;</div><div class="code_line">&nbsp;ListView1.Columns.Add.Caption:=&#39;Value&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;// добавим в диалог открытия несколько типов compound-файлов</div><div class="code_line">&nbsp;OpenDialog1.Filter:=&#39;All Files (*.*)|*.*|MS Office Documents (*.doc;*.xls;*.dot)|*.doc; *.xls; *.dot|MSI Databases (*.msi)|*.msi&#39;;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<strong class='tag-b'>Автор:</strong> <a class='tag-url' href='http://forum.sources.ru/index.php?showuser=12367' target='_blank'>Krid</a>]]></description>
        <author>Krid</author>
        <category>ActiveX, COM, DCOM, CORBA, MIDAS, интерфейсы, OLE, DDE</category>
      </item>
	
      </channel>
      </rss>
	