Я использую COM-объект IFilter для извлечения текста из файлов. Мне удалось извлечь значения свойств OLE (например, значение автора, значение компании и т. д.), но я не мог понять, как узнать, какое значение является автором, компанией и т. д.
CoInitialize(NULL);
IFilter *pFilt;
HRESULT hr = LoadIFilter( L"c:\\bla.docx", 0, (void**)&pFilt );
if ( FAILED( hr ) )
{
cout<<"Bla"<<endl;
}
ULONG flags;
hr = pFilt->Init( IFILTER_INIT_APPLY_INDEX_ATTRIBUTES, 0, 0, &flags );
if ( FAILED( hr ) )
{
cout<<"Bla"<<endl;
}
if(flags == 1)
{
cout<<"With OLE!"<<endl;
}
STAT_CHUNK chunk;
while ( SUCCEEDED( hr = pFilt->GetChunk( &chunk ) ) )
{
if ( CHUNK_TEXT == chunk.flags )
{
WCHAR awc[100];
ULONG cwc = 100;
while ( SUCCEEDED( hr = pFilt->GetText( &cwc, awc ) ) )
{
cout<<awc<<endl;
// process the text buffer. . .
}
}
else // CHUNK_VALUE
{
PROPVARIANT *pVar;
while ( SUCCEEDED( hr = pFilt->GetValue( &pVar ) ) )
{
**// Right here, i can see the value of pVar is the correct author, but i dont know how to tell this is the author, or the company etc..**
PropVariantClear( pVar );
CoTaskMemFree( pVar );
}
}
}
Другими словами, мне нужно знать идентификатор свойства и сопоставить его со значением свойства.
Я видел решения, использующие IPropertyStorage->ReadMultiple, но я пытаюсь получить то же самое с помощью IFilter.
Большое спасибо! Надеюсь, вы найдете ответ.