Leia os metadados do arquivo por meio do Windows Search do programa MFC
-
13-12-2019 - |
Pergunta
Gostaria de ler metadados de um arquivo DWG/AutoCAD por meio do serviço de indexação do Windows Search.Estou falando de propriedades que podem ser acessadas com o botão direito do mouse no explorer sem abrir o AutoCAD.
Eu tenho um aplicativo baseado em diálogo MFC escrito em Visual C++ 2005 e de dentro deste aplicativo gostaria de acessar metadados (como autor, data de criação etc.) do arquivo fornecido.Isso foi feito pelo iFilter, mas está obsoleto desde o Windows XP e desaparecerá no Windows 8 (e o LoadIFilter não está presente no VS2005).Agora, pelo que entendi, isso pode ser feito com a pesquisa do Windows - corrija-me se estiver errado.Cada exemplo que encontrei (incluindo o msdn) mostra como fornecer dados sobre seus próprios arquivos para pesquisa do Windows para indexação.O que preciso é saber como perguntar ao Windows Search sobre os metadados de um determinado arquivo.
Obrigado Tgwilk
EDITAR:Aqui está o que descobri até agora:
BOOL WSQ_DoQuery( const wchar_t *constr, const wchar_t *querystr, VARIANT &result ) {
HRESULT hr = 0;
BOOL ret;
// Get the ADO connection
_Connection *con = NULL;
hr = CoCreateInstance( CLSID_Connection, NULL, CLSCTX_ALL, IID__Connection, (LPVOID *)&con );
if ( SUCCEEDED(hr) ) {
_Recordset *rs = NULL;
// Convert wide strings to BSTR as required by ADO APIs
BSTR bconstr = SysAllocString( constr );
BSTR bquerystr = SysAllocString( querystr );
if ( bconstr && bquerystr ) {
// Open the connection
hr = con->Open( bconstr, NULL, NULL, 0 );
if ( SUCCEEDED(hr) ) {
// Execute the query
hr = con->Execute( bquerystr, NULL, 0, &rs );
if ( SUCCEEDED(hr) ) {
// Display the results
ret = WSQ_GetCDate( rs ,result);
rs->Release();
} else {
TRACE( "Failed to execute query, %08x\r\n", hr );
} // if
} else {
TRACE( "Failed to open ADO connection, %08x\r\n", hr );
} // if
} else {
TRACE("Failed to convert wide to BSTR\r\n" );
} // if
con->Release();
if ( bconstr ) {
SysFreeString( bconstr );
}
if ( bquerystr ) {
SysFreeString( bquerystr );
}
} else {
TRACE("Failed to get connection, %08x\r\n", hr );
} // if
return ret;
} // DoQuery
A string de conexão (constr) é
provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"
conforme retornado por ISearchQueryHelper.E a consulta (querystr) é
SELECT System.Document.DateCreated FROM SystemIndex WHERE System.FileName LIKE 'filename%' AND DIRECTORY='file:C:\path\to\file'
O problema agora é que recebo uma exceção:
First-chance exception at 0x77c5fc56 in fraudTest.exe: Microsoft C++ exception: CNLBaseException at memory location 0x0012d6d0..
nesta linha
hr = con->Open( bconstr, NULL, NULL, 0 );
seguido pelo resultado vazio da consulta (este código é de WSQ_GetCDate):
rs->get_EOF( &eor );
while ( eor != VARIANT_TRUE ) { //this never executes }
Surpreendentemente SUCCEEDED(hr)
retorna verdadeiro após a exceção.Onde cometi um erro e como tentar encontrá-lo?
Obrigado Tgwilk
Solução
Não resolvi esse problema específico, mas aprendi que não preciso do Windows Search para obter os metadados do arquivo.A palavra-chave a ser procurada é “propriedades” em vez de metadados.Recebi meu código do aplicativo de exemplo do Windows SDK v7.0 chamado PropertyEdit.