Lire les métadonnées du fichier via Windows Search à partir du programme MFC
-
13-12-2019 - |
Question
Je souhaite lire les métadonnées d'un fichier DWG/AutoCAD via le service d'indexation Windows Search.Je parle de propriétés accessibles avec le clic droit dans l'explorateur sans ouvrir AutoCAD.
J'ai une application basée sur une boîte de dialogue MFC écrite en Visual C++ 2005 et depuis cette application, j'aimerais accéder aux métadonnées (telles que l'auteur, la date de création, etc.) du fichier donné.Cela a été fait par iFilter mais il est obsolète depuis Windows XP et disparaîtra dans Windows 8 (et LoadIFilter n'est pas présent dans VS2005).Maintenant, d'après ce que j'ai compris, cela peut être fait avec la recherche Windows - corrigez-moi si je me trompe.Chaque exemple que j'ai trouvé (msdn inclus) montre comment fournir des données sur vos propres fichiers à la recherche Windows pour l'indexation.Ce dont j'ai besoin, c'est de savoir comment interroger Windows Search sur les métadonnées d'un fichier donné.
Merci tgwilk
MODIFIER:Voici ce que j'ai trouvé jusqu'à présent :
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
La chaîne de connexion (constr) est
provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"
tel que renvoyé par ISearchQueryHelper.Et la requête (querystr) est
SELECT System.Document.DateCreated FROM SystemIndex WHERE System.FileName LIKE 'filename%' AND DIRECTORY='file:C:\path\to\file'
Le problème maintenant est que j'obtiens une exception :
First-chance exception at 0x77c5fc56 in fraudTest.exe: Microsoft C++ exception: CNLBaseException at memory location 0x0012d6d0..
sur cette ligne
hr = con->Open( bconstr, NULL, NULL, 0 );
suivi du résultat vide de la requête (ce code provient de WSQ_GetCDate) :
rs->get_EOF( &eor );
while ( eor != VARIANT_TRUE ) { //this never executes }
Étonnamment SUCCEEDED(hr)
renvoie vrai après l'exception.Où ai-je commis une erreur et comment essayer de la retrouver ?
Merci tgwilk
La solution
Je n'ai pas résolu ce problème particulier, mais j'ai appris que je n'ai pas besoin de Windows Search pour obtenir les métadonnées du fichier.Le mot-clé à rechercher est « propriétés » au lieu de métadonnées.J'ai obtenu mon morceau de code de l'exemple d'application Windows SDK v7.0 nommé PropertyEdit.