簡體   English   中英

通過MFC程序通過Windows搜索讀取文件元數據

[英]Read file metadata via Windows Search from MFC program

我想通過Windows搜索索引服務讀取DWG / AutoCAD文件的元數據。 我說的是可以在瀏覽器中右鍵單擊而無需打開AutoCAD即可訪問的屬性。

我有一個用Visual C ++ 2005編寫的基於MFC對話框的應用程序,從這個應用程序內部,我想訪問給定文件的元數據(例如作者,創建日期等)。 這是由iFilter完成的,但自Windows XP以來已棄用,它將在Windows 8中消失(並且VS2005中不存在LoadIFilter)。 現在,據我了解,這可以通過Windows搜索完成-如果我錯了,請糾正我。 我發現的每個示例(包括msdn)都顯示了如何將有關自己文件的數據提供給Windows搜索索引。 我需要知道如何詢問Windows Search有關給定文件的元數據。

謝謝tgwilk

編輯:這是到目前為止我想出了什么:

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。 我在哪里犯了錯誤,以及如何嘗試找到它?

謝謝tgwilk

我沒有解決此特定問題,但了解到我不需要Windows Search即可獲取文件元數據。 要查找的關鍵字是“屬性”,而不是元數據。 我從Windows SDK v7.0示例應用程序(名為PropertyEdit)獲得了代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM