<?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=115250&amp;view=findpost&amp;p=2570010</guid>
        <pubDate>Fri, 16 Apr 2010 06:50:17 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2570010</link>
        <description><![CDATA[seryal: Спасибо большое. Получилось.]]></description>
        <author>seryal</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2569787</guid>
        <pubDate>Thu, 15 Apr 2010 19:14:52 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2569787</link>
        <description><![CDATA[Krid: Пользовательские св-ва надо считывать из набора UserDefinedProperties, а ты открываешь SummaryInformation.<br><br>В stgPS.Open вместо FMTID_SummaryInformation юзай FMTID_UserDefinedProperties ({D5CDD505-2E9C-101B-9397-08002B2CF9AE})]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2566494</guid>
        <pubDate>Tue, 13 Apr 2010 05:01:11 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2566494</link>
        <description><![CDATA[seryal: Доброго времени суток.<br>
Подскажите пожалуйста.<br>
Использую за основу код из сообщения #5 от Krid.<br>
Но я хочу получить пользовательское свойство из .DOC файла.<br>
Вот такой код получился.<br>
<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">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;stgRoot: IStorage;</div><div class="code_line">&nbsp;&nbsp;stgPS: IPropertySetStorage;</div><div class="code_line">&nbsp;&nbsp;stgP: IPropertyStorage;</div><div class="code_line">&nbsp;&nbsp;ps: ^TPropSpec;</div><div class="code_line">&nbsp;&nbsp;pv: ^TPropVariant;</div><div class="code_line">&nbsp;&nbsp;ReturnCode: Integer;</div><div class="code_line">begin</div><div class="code_line">// выбираем файл</div><div class="code_line">&nbsp;&nbsp;if (not OpenDialog1.Execute) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Проверяем: если это не compound file и система - не NTFS, тогда выходим.</div><div class="code_line">&nbsp;&nbsp;// (для compound файлов FS не важна)</div><div class="code_line">&nbsp;&nbsp;if (StgIsStorageFile(StringToOleStr(OpenDialog1.FileName))&#60;&#62;S_OK) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (not IsNTFS(OpenDialog1.FileName)) then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;MessageBox(Handle,&#39;NTFS needed for non-compound files&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</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; &nbsp;MessageBox(Handle,&#39;Can not open file&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;stgPS := stgRoot as IPropertySetStorage; &nbsp;// ссылаемся на нужный интерфейс</div><div class="code_line">&nbsp;&nbsp;if (stgPS.Open(FMTID_SummaryInformation, STGM_READ or STGM_SHARE_EXCLUSIVE, stgP) &#60;&#62; S_OK) then // открываем набор св-в</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;MessageBox(Handle,&#39;Can not open property set&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;ps:=nil;</div><div class="code_line">&nbsp;&nbsp;pv:=nil;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(ps,SizeOf(TPropSpec));</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(pv,SizeOf(TPropVariant));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// свойство по номеру</div><div class="code_line">// &nbsp; &nbsp;ps.ulKind := PRSPEC_PROPID;</div><div class="code_line">// &nbsp; &nbsp;ps.propid := PIDSI_TITLE;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// свойство по имени</div><div class="code_line">&nbsp;&nbsp; &nbsp;ps.ulKind := PRSPEC_LPWSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ps.lpwstr := &#39;QWERTY&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// читаем св-во</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReturnCode := stgP.ReadMultiple(1, ps, pv);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ReturnCode = S_OK then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ShowMessage(pv.pszVal)</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ShowMessage(&#39;Error!!!&#39;);</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;if assigned(ps) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeMem(ps);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if assigned(pv) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeMem(pv);</div><div class="code_line">&nbsp;&nbsp; &nbsp;stgP := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;stgPS := nil;</div><div class="code_line">&nbsp;&nbsp; &nbsp;stgRoot := nil;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
В тестируемом DOC файле создал свойство QWERTY при чтении свойство по имени всегда S_FALSE.<br>
Чтение стандартных свойств по номеру работает.<br>
Подскажите, пожалуйста что я не правильно делаю.]]></description>
        <author>seryal</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2477733</guid>
        <pubDate>Mon, 18 Jan 2010 10:10:14 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=2477733</link>
        <description><![CDATA[miheiro: работаю на builder c++,<br>
<br>
но к сожалению, у меня при вызове <br>
hr = pPropSetStg-&gt;Open(PropSetfmtid, STGM_READ, &amp;pPropStg );<br>
получаю hr равную -2147286785, т.е. возникает ошибка, для doc файлов такая ошибка не возникает<br>
<br>
вот весь участок кода:<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">FMTID PropSetfmtid={0xf29f85e0,0x4ff9,0x1068,{0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 }};</div><div class="code_line">HRESULT hr = S_OK;</div><div class="code_line">IPropertyStorage *pPropStg = NULL;</div><div class="code_line">IPropertySetStorage *pPropSetStg = NULL;</div><div class="code_line">IStorage *stgRoot = NULL;</div><div class="code_line">PROPSPEC propspec;</div><div class="code_line">PROPVARIANT propRead;</div><div class="code_line">&nbsp;</div><div class="code_line">if (StgOpenStorageEx(StringToOleStr(FileName), STGM_READ | STGM_SHARE_DENY_WRITE,</div><div class="code_line">STGFMT_ANY, 0, NULL, NULL, IID_IPropertySetStorage, reinterpret_cast&#60;void**&#62;(&amp;pPropSetStg))</div><div class="code_line">!= S_OK) return;</div><div class="code_line">&nbsp;</div><div class="code_line">//if (pPropSetStg-&#62;Open(PropSetfmtid, STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READ, &amp;pPropStg ) != S_OK)</div><div class="code_line">// return;</div><div class="code_line">hr = pPropSetStg-&#62;Open(PropSetfmtid, STGM_DIRECT | STGM_SHARE_EXCLUSIVE | STGM_READ, &amp;pPropStg );</div><div class="code_line">&nbsp;</div><div class="code_line">propspec.ulKind = PRSPEC_PROPID;</div><div class="code_line">propspec.propid = 0x00000002; </div><div class="code_line">&nbsp;</div><div class="code_line">pPropStg-&#62;ReadMultiple(1, &amp;propspec, &amp;propRead);</div><div class="code_line">AnsiString Title = propRead.pszVal;</div></ol></div></div></div></div><br>
подскажите пожалуйста как можно считать свойства из pdf и djvu файла? почему возникает ошибка?]]></description>
        <author>miheiro</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1690303</guid>
        <pubDate>Sun, 09 Sep 2007 06:16:45 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1690303</link>
        <description><![CDATA[alex_sporik: MSI файлы - это наборы таблиц и комманд для интерпретатора msiexec. Разумеется вы можете опросить таблицы внутри msi на предмет количесва названия файлов всего что вы пожелаете, есть даже SQL подобный язык. Для интересующихся - скачайте Microsoft MSI Orca. (http://www.technipages.com/downloadview-details-44-Orca_MSI_Editor.html).<br>
<br>
Примерно код для прочтения какого либо свойтсва из MSI:<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">const msilib = &#39;msi.dll&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MSIHANDLE = DWORD; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;TMsiHandle = MSIHANDLE;</div><div class="code_line">&nbsp;</div><div class="code_line">function MsiCloseHandle(hAny: MSIHANDLE):UINT;stdcall;external msilib name &#39;MsiCloseHandle&#39;;</div><div class="code_line">function MsiOpenProduct(szProduct:LPCSTR;var hProduct:MSIHANDLE):UINT;stdcall;external msilib name &#39;MsiOpenProductA&#39;;</div><div class="code_line">function MsiGetProductProperty(hProduct:MSIHANDLE;szProperty:LPCSTR;lpValueBuf:LPSTR;pcchValueBuf:LPDWORD):UINT;stdcall; external msilib name &#39;MsiGetProductPropertyA&#39;;</div><div class="code_line">function MsiSetInternalUI(dwUILevel:INSTALLUILEVEL;phWnd:LPHWND):INSTALLUILEVEL;stdcall; external msilib name &#39;MsiSetInternalUI&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetMSIProperty(aProductCode:string):string;</div><div class="code_line">var </div><div class="code_line">&nbsp;msi:TMSIHandle;</div><div class="code_line">&nbsp;t:string;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;function _getmsiproperty(_name:string):string;</div><div class="code_line">&nbsp;var</div><div class="code_line">&nbsp;&nbsp;txt:PChar;</div><div class="code_line">&nbsp;&nbsp;sz:DWORD;</div><div class="code_line">&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;sz:=MAX_PATH;</div><div class="code_line">&nbsp;&nbsp;txt:=AllocMem(sz+1);</div><div class="code_line">&nbsp;&nbsp;if MsiGetProductProperty(msi,PChar(_name),txt,@sz)=ERROR_MORE_DATA then</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReAllocMem(txt,sz+1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;MsiGetProductProperty(msi,PChar(_name),txt,@sz);</div><div class="code_line">&nbsp;&nbsp; end;</div><div class="code_line">&nbsp;&nbsp;SetString(Result,txt,sz);</div><div class="code_line">&nbsp;&nbsp;FreeMem(txt,sz+1);</div><div class="code_line">&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;MsiSetInternalUI(2,nil); // скрываем GUI</div><div class="code_line">&nbsp;if MsiOpenProduct(PChar(aProductCode),msi)=ERROR_SUCCESS then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; t:=_getmsiproperty(&#39;ARPPRODUCTICON&#39;); // главная иконка приложения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;ProductIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;CompleteSetupIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;CustomSetupIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;InfoIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;InstallerIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;RemoveIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if t=&#39;&#39; then t:=_getmsiproperty(&#39;RepairIcon&#39;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; Result:=t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; MsiCloseHandle(msi);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>alex_sporik</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1687212</guid>
        <pubDate>Thu, 06 Sep 2007 07:07:42 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1687212</link>
        <description><![CDATA[к.б.н.: Благодарю&#33;<br>Отличный код. Все работает. Правда, чтобы получить только необходимое (название, коммент., автор...), я его несколько укоротил.<br><br>Для таких же тупых как я, прокомментирую:<br>Здесь используется новый интерфейс GDI+.  Работает на Windows XP и .NET Server, на более ранних ПО не работает (без определенной доработки).<br>Чтобы с этим кодом заработал Delphi, в него надо установить соответствующие заголовочные файлы (подробности http://www.delphikingdom.com/asp/viewitem.asp?catalogid=772 )]]></description>
        <author>к.б.н.</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1686787</guid>
        <pubDate>Wed, 05 Sep 2007 17:14:38 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1686787</link>
        <description><![CDATA[Krid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=115250&view=findpost&p=1684900'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>к.б.н. &#064; <time class="tag-quote__quoted-time" datetime="2007-09-04T07:21:38+00:00">04.09.07, 07:21</time></span><div class='quote '>Мне нужно получать свойства (автор, ключевые слова) из не compound файлов (в частности TIFF, JPEG). Как я понял, на этом форуме говорится именно об этом.</div></div><br>
Не правильно понял. Читай внимательно предыдущие посты и введение к коду из фака (<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=115495' target='_blank'>как извлечь &quot;Сводку&quot; свойств файла</a>). Там говорится о стандартных св-вах, хранящихся либо внутри compound файлов либо в файловых потоках, ассоциированных с файлом. <br>
А получение специфических св-в файлов определённого типа - это совсем из другой оперы. Тут используются свои наборы API (см. например, код <strong class='tag-b'>Rouse_</strong> - там юзаются ф-ции из gdiplus.dll)/свои интерфейсы/прямое чтение &quot;тэгов&quot; из файла/etc. <br>
Вобщем, твой вопрос (о св-вах TIFF, JPEG) скорее для форума <a class='tag-url' href='http://forum.sources.ru/index.php?showforum=89' target='_blank'>Delphi: Multimedia</a>]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1684981</guid>
        <pubDate>Tue, 04 Sep 2007 08:41:27 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1684981</link>
        <description><![CDATA[Rouse_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=115250&view=findpost&p=1684900'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>к.б.н. &#064; <time class="tag-quote__quoted-time" datetime="2007-09-04T07:21:38+00:00">04.09.07, 07:21</time></span><div class='quote '>Мне нужно получать свойства (автор, ключевые слова) из не compound файлов (в частности TIFF, JPEG). </div></div><br>
<br>
Вот тебе пример. Снимает то, что тебе нужно и немного еще (из дополнительных свойств нет времени писать демку полного разбора)<br>
<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">uses</div><div class="code_line">&nbsp;&nbsp;GDIPOBJ,</div><div class="code_line">&nbsp;&nbsp;GDIPAPI,</div><div class="code_line">&nbsp;&nbsp;GDIPUTIL,</div><div class="code_line">&nbsp;&nbsp;ActiveX;</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;function GetAdvTagData(const ID: Integer): String;</div><div class="code_line">&nbsp;&nbsp;const</div><div class="code_line">&nbsp;&nbsp; &nbsp;TAG_Title &nbsp; &nbsp; = 40091;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TAG_Comments &nbsp;= 40092;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TAG_Author &nbsp; &nbsp;= 40093;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TAG_KeyWords &nbsp;= 40094;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TAG_Subject &nbsp; = 40095;</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;case ID of</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TAG_Title: &nbsp; &nbsp;Result := &#39;Title&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TAG_Comments: Result := &#39;Comments&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TAG_Author: &nbsp; Result := &#39;Author&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TAG_KeyWords: Result := &#39;KeyWords&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TAG_Subject: &nbsp;Result := &#39;Subject&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</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;GDIImage: TGPImage;</div><div class="code_line">&nbsp;&nbsp;I, ACount, PropSize: Integer;</div><div class="code_line">&nbsp;&nbsp;PropertyesList: array of TPropId;</div><div class="code_line">&nbsp;&nbsp;PropertyItem: PPropertyItem;</div><div class="code_line">&nbsp;&nbsp;PropName: String;</div><div class="code_line">&nbsp;&nbsp;PropValue: WideString;</div><div class="code_line">&nbsp;&nbsp;ByteValue: DWORD;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if OpenDialog1.Execute then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Memo1.Clear;</div><div class="code_line">&nbsp;&nbsp; &nbsp;GDIImage := TGPImage.Create(OpenDialog1.FileName);</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ACount := GDIImage.GetPropertyCount;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;SetLength(PropertyesList, ACount);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GDIImage.GetPropertyIdList(ACount, @PropertyesList[0]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;for I := 0 to ACount - 1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PropSize := GDIImage.GetPropertyItemSize(PropertyesList[I]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;GetMem(PropertyItem, PropSize);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;GDIImage.GetPropertyItem(PropertyesList[I], PropSize, PropertyItem);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PropName := GetAdvTagData(PropertyesList[I]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if PropName &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(PropValue, PropertyItem^.length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Move(PropertyItem^.value^, PropValue[1], PropertyItem^.length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PropName := GetMetaDataIDString(PropertyItem^.id);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ByteValue := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if PropertyItem^.type_ in</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[PropertyTagTypeByte, PropertyTagTypeShort,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PropertyTagTypeLong] then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if PropertyItem^.length &#60;= 4 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Move(PropertyItem^.value^, ByteValue, PropertyItem^.length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PropValue := IntToStr(ByteValue);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SetLength(PropValue, PropertyItem^.length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Move(PropertyItem^.value^, PropValue[1], PropertyItem^.length);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Memo1.Lines.Add(PropName + &#39; - &#39; + PropValue);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FreeMem(PropertyItem);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GDIImage.Free;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1684900</guid>
        <pubDate>Tue, 04 Sep 2007 07:21:38 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=1684900</link>
        <description><![CDATA[к.б.н.: Господа программисты, помогите&#33;<br>Имею биологическое образование. Третью неделю лажу по интернету, одно понял - без вашей помощи мне не обойтись.<br>Мне нужно получать свойства (автор, ключевые слова) из не compound файлов (в частности TIFF, JPEG). Как я понял, на этом форуме говорится именно об этом. Но разговор окончился на том, что Krid изменил код на подходящий, и... все.<br>Выручайте&#33; Опубликуйте исходник.]]></description>
        <author>к.б.н.</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876880</guid>
        <pubDate>Thu, 06 Oct 2005 07:48:02 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876880</link>
        <description><![CDATA[SexGenius: <strong class='tag-b'>Krid</strong>, огромадное спасибо &#33;&#33;&#33; [+] &#33;&#33;&#33;&#33;]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876674</guid>
        <pubDate>Thu, 06 Oct 2005 04:10:22 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876674</link>
        <description><![CDATA[Krid: Ах вон ты чего хочешь  :) Ну это тоже можно сделать. <br>
Дело в том, что NTFS позволяет для каждого файла создавать т.н. <em class='tag-i'>файловые потоки (files stream)</em>. По сути это те же файлы, только их не видно и они имеют &quot;особые&quot; атрибуты в ФС. С ними можно работать так же, как и с обычными файлами: создавать, удалять, записывать в них инфу (можно юзать почти все файловые API ф-ции). <br>
Когда ты открываешь вкладку &quot;Свойства&quot; и пишешь там чего-нить, винда создает для этого файла несколько потоков, в которые записывает то, что ты ввел. <br>
С потоками можно работать, например из ком. строки в консоли:<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">Создание файла с потоком:</div><div class="code_line">type nul &#62; somefile.txt:Stream</div><div class="code_line">&nbsp;</div><div class="code_line">Запись в поток:</div><div class="code_line">echo &quot;Something&quot; &#62;&#62; somefile.txt:Stream</div><div class="code_line">&nbsp;</div><div class="code_line">Чтение из потока:</div><div class="code_line">more &#60; somefile:Stream</div><div class="code_line">&nbsp;</div><div class="code_line">Копирование содержимого существующего файла в поток:</div><div class="code_line">type file1.txt &#62;&#62; somefile.txt:Stream</div><div class="code_line">&nbsp;</div><div class="code_line">Копирование содержимого потока в файл:</div><div class="code_line">more &#60; somefile.txt:Stream &#62;&#62; file2.txt</div><div class="code_line">&nbsp;</div><div class="code_line">Удаление потоков выполняется через DeleteFile.</div></ol></div></div></div></div><br>
а можно и в программе (пример создания потока):<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">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;dwRet:DWORD;</div><div class="code_line">&nbsp;hFile,hStream:THandle;</div><div class="code_line">begin</div><div class="code_line">// создаем файл</div><div class="code_line">hFile:=CreateFile( &#39;C:\testfile.txt&#39;, GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);</div><div class="code_line">CloseHandle(hFile);</div><div class="code_line">&nbsp;</div><div class="code_line">// создаем в нем поток и пишем в него чего-нибудь.</div><div class="code_line">hStream:=CreateFile( &#39;C:\testfile.txt:mystream&#39;, GENERIC_WRITE, FILE_SHARE_WRITE, nil, OPEN_ALWAYS, 0, 0);</div><div class="code_line">WriteFile( hStream, &#39;This is a stream&#39;, 17, dwRet, nil );</div><div class="code_line">CloseHandle(hStream);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Соотв. читается инфа из потока ф-цией ReadFile.<br>
Т.е., по идее, нужно открыть один из потоков, созданных виндой при записи св-в, прочитать его и выудить оттуда нужную инфу. <br>
<br>
Но в Win2K появилась ф-ция StgOpenStorageEx, которая сама всем этим занимается. Причем в ней можно задать флаги так, что она будет одинаково работать и с compound файлами (содержащими св-ва  внутри себя) и с обычными файлами, св-ва которых находятся в отдельном потоке -  винда сама определит, что за файл.<br>
<br>
Короче пример в посте #5 я изменил - теперь он может читать св-ва как из compound, так и из обычных файлов (если, конечно у этих файлов есть набор св-в).]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876479</guid>
        <pubDate>Wed, 05 Oct 2005 17:56:39 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876479</link>
        <description><![CDATA[SexGenius: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>Krid, 05.10.2005, 20:44:11, 876474</span><div class='quote '>Еще раз скажу, что таким макаром, как в примере могут открываться только compound файлы. </div></div><br>
А есть-ли какой-нить универсальный макар, которым можно считывать информацию со вкладки Сводка для любых файлов NTFS . Может какие-нить константы повтыкать другие в функции ?]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876474</guid>
        <pubDate>Wed, 05 Oct 2005 17:44:11 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876474</link>
        <description><![CDATA[Krid: Дык, естественно&#33; pdf - это не compound (doc/structured storage / хранилище структуированых данных). Они и не должны так открываться - у них совсем другой формат. Еще раз скажу, что таким макаром, как в примере могут открываться <strong class='tag-b'>только</strong> <a class='tag-url' href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/stg/stg/structured_storage_start_page.asp' target='_blank'>compound</a> файлы. А pdf и djvu к ним никакого отношения не имеют  :no:]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876417</guid>
        <pubDate>Wed, 05 Oct 2005 16:46:48 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876417</link>
        <description><![CDATA[SexGenius: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <span class='tag-quote__quote-info'>Krid, 05.10.2005, 19:32:12, 876404</span><div class='quote '>Да это чего-то OleCheck мудрит. Я бы ее вообще убрал и написал что-то типа</div></div><br>
Тады при открытии djvu или pdf-файла прога пишет, как ты догадался, следующее:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Can not open doc file</div></div>]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876404</guid>
        <pubDate>Wed, 05 Oct 2005 16:32:12 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=876404</link>
        <description><![CDATA[Krid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=115250&view=findpost&p=873988'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>SexGenius &#064; <time class="tag-quote__quoted-time" datetime="2005-10-03T11:15:39+00:00">03.10.05, 11:15</time></span><div class='quote '>Если эту прогу запустить дважды, то на второй раз она скажет &quot;Error - файл уже используется&quot;. И это будет пока не перезагрузишься.</div></div><br>
Ну правильно, это из-за STGM_SHARE_EXCLUSIVE. Этот флаг задает монопольный доступ к файлу (или секции/хранилищу/набору св-в в нем) для одной программы. Просто, в то время как ты читаешь из файла, другая прога может в него писать (например поменять св-во). А это не есть гуд. <br>
<br>
Ну тут можно либо закрыть файл - т.е., после всех операций написать<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">&nbsp;stgRoot:=nil;</div></ol></div></div></div></div>либо открыть, например так <em class='tag-i'>STGM_READ or STGM_SHARE_DENY_WRITE</em> (вообще, поэксперементируй с флагами - их там до е@#-матери, см. MSDN). А вообще, по-идее, в моем примере такой ошибки быть не должно - файл закрывается по выходе из Button1Click (stgRoot - локальная).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=115250&view=findpost&p=875241'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>SexGenius &#064; <time class="tag-quote__quoted-time" datetime="2005-10-04T15:06:45+00:00">04.10.05, 15:06</time></span><div class='quote '>При выборе pdf или вомг - файла прога пишет :</div></div><br>
Да это чего-то OleCheck мудрит. Я бы ее вообще убрал и написал что-то типа<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">if (StgOpenStorage(StringToOleStr(OpenDialog1.FileName),nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STGM_READ or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot)&#60;&#62;S_OK) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; MessageBox(Handle,&#39;Can not open doc file&#39;,&#39;Error&#39;,MB_ICONERROR);</div><div class="code_line">&nbsp;&nbsp; exit;</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
И кстати, везде убрал бы эту OleCheck (как-то она жисть осложняеть  :)) и все бы делал ручками.<br>
<br>
Вобщем, код подправил. Должно работать нормально. А так - эксперементируй и не ищи легких путей :)]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=875241</guid>
        <pubDate>Tue, 04 Oct 2005 15:06:45 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=875241</link>
        <description><![CDATA[SexGenius: <strong class='tag-b'>Krid</strong>, ну отзовись пожалуйста  :(  . При выборе pdf или вомг - файла прога пишет :<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>*.Экзе рэйсед экспепшен класс EOleSysError whith message &quot;%1 уже существует&quot;</div></div><br>
<br>
Чего это она ?]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=874936</guid>
        <pubDate>Tue, 04 Oct 2005 10:29:31 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=874936</link>
        <description><![CDATA[SexGenius: Народ, ну, что серьезно никто не знает как решается проблема то ?]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=874376</guid>
        <pubDate>Mon, 03 Oct 2005 17:41:33 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=874376</link>
        <description><![CDATA[SexGenius: Еще у меня вопрос... Я не понял что же дает <strong class='tag-b'>STGM_SHARE_EXCLUSIVE </strong> ?<br>
В MSDN написано <br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><strong class='tag-b'>STGM_SHARE_EXCLUSIVE</strong> <br>
<span class="tag-color tag-color-named" data-value="blue" style="color: blue">Prevents others from subsequently opening the object in any mode. </span>Note that this value is <span class="tag-color tag-color-named" data-value="blue" style="color: blue">not a simple</span> bitwise OR operation of the STGM_SHARE_DENY_READ and STGM_SHARE_DENY_WRITE values. In transacted mode, sharing of STGM_SHARE_DENY_WRITE or STGM_SHARE_EXCLUSIVE can significantly improve performance since they don&#39;t require snapshotting. See the following Remarks section for more information about transactioning. </div></div><br>
Обратите внимание на выделенно <span class="tag-color tag-color-named" data-value="blue" style="color: blue">синим</span>. Не это ли мешает открывать файл впоследствии?]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=873988</guid>
        <pubDate>Mon, 03 Oct 2005 11:15:39 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=873988</link>
        <description><![CDATA[SexGenius: <strong class='tag-b'>Krid</strong>, замечательный пример &#33; <br>
Меня смущает одно. Если эту прогу запустить дважды, то на второй раз она скажет &quot;Error - файл уже используется&quot;. И это будет пока не перезагрузишься.  :huh:  <br>
Cдается мне что файлик то надо закрывать ... Так как здесь есть <strong class='tag-b'>Open</strong><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">OleCheck(StgOpenStorage(StringToOleStr(OpenDialog1.FileName),nil,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STGM_READ or STGM_SHARE_EXCLUSIVE,nil,0,stgRoot)); &nbsp; // открываем его</div></ol></div></div></div></div><br>
, то должен быть и <strong class='tag-b'>Close</strong> . <br>
Кстати, не подскажешь как его вызвать то ?]]></description>
        <author>SexGenius</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=862997</guid>
        <pubDate>Wed, 21 Sep 2005 17:13:39 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=862997</link>
        <description><![CDATA[Krid: Вообще, *.msi - это обычные compound-файлы (или structured storage - файлы хранения структуированых данных) и они, помимо прочего, хранят в себе т.н. наборы cвойств, т.е. информацию о документе (которую видно на той же вкладке &quot;Сводка&quot;). Все эти св-ва можно прочитать напрямую из файла. Для этого в винде предназначены COM-интерфейсы IPropertySetStorage, IPropertyStorage, etc. <br>
Вот небольшой примерчик считывания некоторых св-в из любых compound файлов, а так же св-ва обычных файлов (которые отображаются на вкладке &quot;Сводка&quot; диалогового окна &quot;Свойства:&quot;):<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 для набора св-в 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">// Этот код в стиле VB чисто для примера. Узнать, какая FS в системе можно и через WinAPI</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">fso := CreateOleObject(&#39;Scripting.FileSystemObject&#39;);</div><div class="code_line">drv := fso.GetDrive(fso.GetDriveName(AFileName));</div><div class="code_line">Result:=drv.FileSystem = &#39;NTFS&#39;</div><div class="code_line">end;</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;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;</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;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;// наборы св-в могут храниться не только в *.msi, но и в любых compound-файлах (например в документах MS Office)</div><div class="code_line">&nbsp;OpenDialog1.Filter:=&#39;MSI Databases (*.msi)|*.msi|MS Office Documents (*.doc;*.xls)|*.doc; *.xls|All Files (*.*)|*.*&#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><br>
<br>
В наборе SummaryInformation есть еще несколько св-в (не все из них строковые). Также compound-файлы могут содержать и другие наборы св-в, например DocumentSummaryInformation, UserDefinedProperties, а также какие-нибудь произвольно определенные пользователем. Вся инфа - в MSDN. Прототипы, константы, структуры - в ActiveX.pas]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=861131</guid>
        <pubDate>Mon, 19 Sep 2005 20:32:28 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=861131</link>
        <description><![CDATA[Rouse_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=115250&view=findpost&p=861086'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ctranik &#064; <time class="tag-quote__quoted-time" datetime="2005-09-19T19:21:46+00:00">19.09.05, 19:21</time></span><div class='quote '>но все эти данные также есть в реестрее</div></div><br>
Хм, я вообщето обьяснял про неустановленный MSI пакет :)]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=861086</guid>
        <pubDate>Mon, 19 Sep 2005 19:21:46 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=861086</link>
        <description><![CDATA[ctranik: <strong class='tag-b'>Rouse_</strong><br>
<br>
кажется всё очень просто, может фаил что то и хранит внутри себя<br>
но все эти данные также есть в реестрее<br>
<br>
Как говоритсяб а ЛАРЧИК-то просто открывался &#33;&#33;&#33;&#33;&#33;]]></description>
        <author>ctranik</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=861025</guid>
        <pubDate>Mon, 19 Sep 2005 17:47:52 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=861025</link>
        <description><![CDATA[Rouse_: Хм красивый вопрос... Первый раз такой слышу, никто раньше не интересовался.<br>
По сабжу: <a class='tag-url' href='http://msdn.microsoft.com/library/en-us/msi/setup/msigetproductinfofromscript.asp' target='_blank'>MsiGetProductInfoFromScript</a><br>
<br>
Вообще смотри вот сюда: http://msdn.microsoft.com/library/en-us/msi/setup/installer_function_reference.asp]]></description>
        <author>Rouse_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=860976</guid>
        <pubDate>Mon, 19 Sep 2005 16:14:18 +0000</pubDate>
        <title>Как извлечь информацию из файла</title>
        <link>https://forum.sources.ru/index.php?showtopic=115250&amp;view=findpost&amp;p=860976</link>
        <description><![CDATA[ctranik: Всем привет<br><br>Разьясните пожалуйсто,как из файлов с расширением &quot;*.msi&quot; , с помощью API-функций<br> из закладки &quot;Сводка&quot; извлечь информацию о Авторе и Теме<br><br>Заранее благодарен.]]></description>
        <author>ctranik</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      </channel>
      </rss>
	