Frage

Ich möchte Metadaten einer DWG/AutoCAD-Datei über den Windows Search-Indizierungsdienst lesen.Ich spreche von Eigenschaften, auf die mit der rechten Maustaste im Explorer zugegriffen werden kann, ohne AutoCAD zu öffnen.

Ich habe eine auf MFC-Dialogen basierende Anwendung, die in Visual C++ 2005 geschrieben ist, und möchte von dieser App aus auf Metadaten (wie Autor, Erstellungsdatum usw.) der angegebenen Datei zugreifen.Dies wurde von iFilter durchgeführt, ist jedoch seit Windows XP veraltet und wird in Windows 8 nicht mehr verwendet (und LoadIFilter ist in VS2005 nicht vorhanden).Soweit ich weiß, ist dies mit der Windows-Suche möglich. Korrigieren Sie mich, wenn ich falsch liege.Jedes Beispiel, das ich gefunden habe (einschließlich MSDN), zeigt jedoch, wie man Daten über seine eigenen Dateien zur Indizierung an die Windows-Suche weitergibt.Ich muss wissen, wie ich Windows Search nach Metadaten für eine bestimmte Datei fragen kann.

Danke Tgwilk

BEARBEITEN:Folgendes habe ich bisher herausgefunden:

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

Die Verbindungszeichenfolge (constr) ist

provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"

wie von ISearchQueryHelper zurückgegeben.Und die Abfrage (querystr) ist

SELECT System.Document.DateCreated FROM SystemIndex WHERE System.FileName LIKE 'filename%' AND DIRECTORY='file:C:\path\to\file'

Das Problem ist jetzt, dass ich eine Ausnahme bekomme:

First-chance exception at 0x77c5fc56 in fraudTest.exe: Microsoft C++ exception: CNLBaseException at memory location 0x0012d6d0..

auf dieser Linie

hr = con->Open( bconstr, NULL, NULL, 0 );

gefolgt vom leeren Ergebnis der Abfrage (dieser Code stammt von WSQ_GetCDate):

rs->get_EOF( &eor );
while ( eor != VARIANT_TRUE ) { //this never executes }

Überraschenderweise SUCCEEDED(hr) gibt nach der Ausnahme true zurück.Wo habe ich einen Fehler gemacht und wie kann ich ihn finden?

Danke Tgwilk

War es hilfreich?

Lösung

Ich habe dieses spezielle Problem nicht gelöst, aber ich habe gelernt, dass ich die Windows-Suche nicht benötige, um die Dateimetadaten abzurufen.Das Schlüsselwort, nach dem gesucht werden muss, ist „Eigenschaften“ statt Metadaten.Ich habe meinen Code aus der Windows SDK v7.0-Beispielanwendung mit dem Namen PropertyEdit erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top