[英]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.