1

我想通过 Windows 搜索索引服务读取 DWG/AutoCAD 文件的元数据。我说的是可以通过在资源管理器中右键单击而无需打开 AutoCAD 来访问的属性。

我有一个用 Visual C++ 2005 编写的基于 MFC 对话框的应用程序,我想从这个应用程序内部访问给定文件的元数据(例如作者、创建日期等)。这是由 iFilter 完成的,但自 Windows XP 以来已被弃用,并且将在 Windows 8 中消失(并且 LoadIFilter 在 VS2005 中不存在)。现在据我了解,可以使用 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

4

1 回答 1

0

我没有解决这个特殊问题,但我了解到我不需要 Windows Search 来获取文件元数据。要查找的关键字是“属性”而不是元数据。我从名为 PropertyEdit 的 Windows SDK v7.0 示例应用程序中获得了一段代码。

于 2012-10-23T19:40:08.490 回答