我想通过Windows搜索索引服务读取DWG/AutoCAD文件的元数据。我说的是在资源管理器中单击鼠标右键即可访问的特性,而无需打开AutoCAD。
我有一个用Visual C++2005编写的基于MFC对话框的应用程序,我想从这个应用程序中访问给定文件的元数据(如作者、创建日期等)。这是iFilter完成的,但自Windows XP以来,它已被弃用,并将在Windows 8中消失(而LoadIFilter在VS2005中不存在)。现在,据我所知,这可以通过windows搜索来完成——如果我错了,请纠正我。我发现的每个例子(包括msdn)都展示了如何将自己文件的数据提供给windows搜索进行索引。我需要的是知道如何向Windows Search询问给定文件的元数据。
谢谢t.g.wilk
编辑:以下是我到目前为止的想法:
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, %08xrn", hr );
} // if
} else {
TRACE( "Failed to open ADO connection, %08xrn", hr );
} // if
} else {
TRACE("Failed to convert wide to BSTRrn" );
} // if
con->Release();
if ( bconstr ) {
SysFreeString( bconstr );
}
if ( bquerystr ) {
SysFreeString( bquerystr );
}
} else {
TRACE("Failed to get connection, %08xrn", 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:pathtofile'
现在的问题是我得到了一个例外:
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。我在哪里犯了错误?如何找到它?
谢谢t.g.wilk
我没有解决这个特定的问题,但我了解到我不需要Windows搜索来获取文件元数据。要查找的关键字是"属性",而不是元数据。我从名为PropertyEdit的WindowsSDKv7.0示例应用程序中获得了一段代码。