MFCプログラムからのWindows検索でファイルメタデータを読み取る
-
13-12-2019 - |
質問
Windows検索索引サービスを介してDWG / AutoCADファイルのメタデータを読みたいと思います。 AutoCADを開くことなくエクスプローラを右クリックしてアクセスできるプロパティについて話しています。
私は、Visual C ++ 2005で書かれたMFCダイアログベースのアプリケーションを持っています。このアプリの内部から、指定されたファイルのメタデータ(作成日など)にアクセスします。これはIFilterによって行われましたが、Windows XP以降はWindows 8では廃止予定されています(そして、LoadifilterはVS2005には存在しません)。私が理解しているものから今、それはWindows検索で行うことができます - 私が間違っているなら私を修正してください。私が見つけたすべての例(msdn inclumed)は、索引付けを検索するための独自のファイルに関するデータをWindows検索に与える方法を示しています。私が必要なのは、特定のファイルのメタデータについてWindows検索方法を知ることです。
感謝 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, %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を返します。
私はエラーとそれをどのように見つけて見つけるかをどこで行ったのか?
感謝 T.G.Wilk
解決
私はこの特定の問題を解決しなかったが、私はファイルメタデータを取得するためにWindows検索を必要としないことを学びました。探すキーワードは、メタデータの代わりに「プロパティ」です。私はPropertyEditという名前のWindows SDK v7.0のサンプルアプリケーションからコードを取得しました。