Считывание метаданных файла с помощью поиска Windows из программы MFC

StackOverflow https://stackoverflow.com//questions/12717040

Вопрос

Я хотел бы прочитать метаданные файла DWG/AutoCAD с помощью службы индексации поиска Windows.Я говорю о свойствах, доступ к которым можно получить, щелкнув правой кнопкой мыши в проводнике, не открывая AutoCAD.

У меня есть приложение на основе диалогового окна MFC, написанное на Visual C++ 2005, и из этого приложения я хотел бы получить доступ к метаданным (таким как автор, дата создания и т.д.) данного файла.Это было сделано с помощью IFilter, но оно устарело начиная с Windows XP и исчезнет в Windows 8 (а LoadIFilter отсутствует в VS2005).Теперь, насколько я понимаю, это можно сделать с помощью поиска Windows - поправьте меня, если я ошибаюсь.Однако в каждом примере, который я нашел (включая msdn), показано, как передавать данные о ваших собственных файлах в Windows search для индексации.Что мне нужно, так это знать, как запросить поиск Windows о метаданных для данного файла.

Спасибо т.г.Уилку

РЕДАКТИРОВАТЬ:Вот к чему я пришел на данный момент:

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

Строка подключения (constr) - это

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

как возвращено ISearchQueryHelper.И запрос (querystr) является

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

Проблема сейчас в том, что я получаю исключение:

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

на этой линии

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

за которым следует пустой результат запроса (этот код взят из WSQ_GetCDate):

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

Удивительно SUCCEEDED(hr) возвращает значение true после исключения.Где я допустил ошибку и как попытаться ее найти?

Спасибо т.г.Уилку

Это было полезно?

Решение

Я не решил эту конкретную проблему, но я узнал, что мне не нужен поиск Windows для получения метаданных файла.Ключевое слово, которое нужно искать, - это "свойства", а не метаданные.Я получил свой фрагмент кода из примера приложения Windows SDK v7.0 с именем PropertyEdit.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top