Pregunta

Me gustaría leer metadatos de un archivo DWG / AutoCAD a través del servicio de indexación de búsqueda de Windows. Estoy hablando de propiedades a las que se puede acceder con el clic derecho en Explorer sin abrir AutoCAD.

Tengo una aplicación basada en el cuadro de diálogo de MFC escrita en Visual C ++ 2005 y desde dentro de esta aplicación, me gustaría acceder a Metadata (como autor, fecha de creación, etc.) del archivo dado. Esto se hizo por FIILTER, pero está en desuso desde que Windows XP y se habrá ido en Windows 8 (y Loadifilter no está presente en VS2005). Ahora, de lo que entiendo, se puede hacer con la búsqueda de Windows, corríjame si me equivoco. Todos los ejemplos que encontré (MSDN incluidos) muestran cómo dar datos sobre sus propios archivos a Windows Buscar la indexación. Lo que necesito es saber cómo solicitar la búsqueda de Windows sobre los metadatos para un archivo dado.

gracias T.G.WILK

Editar: Esto es lo que he llegado hasta ahora:

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 cadena de conexión (constr) es

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

Según lo devuelto por IsearchQueryHelper. Y la consulta (querystr) es

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

El problema ahora es que obtengo una excepción:

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

en esta línea

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

seguido del resultado vacío de la consulta (este código es de WSQ_GETCDATE):

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

Suprisadamente SUCCEEDED(hr) devuelve verdadero después de la excepción. ¿Dónde he hecho un error y cómo intentarlo?

gracias T.G.WILK

¿Fue útil?

Solución

No resolví este problema en particular, pero aprendí que no necesito la búsqueda de Windows para obtener los metadatos del archivo.La palabra clave para buscar es "Propiedades" en lugar de meta-datos.Recibí mi código de código de muestra Windows SDK V7.0 llamado PropertyEdit.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top