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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top