Чтение метаданных файла с помощью Windows Search из программы MFC
Я хотел бы прочитать метаданные файла DWG/AutoCAD через службу индексирования Windows Search. Я говорю о свойствах, доступ к которым можно получить, щелкнув правой кнопкой мыши в проводнике, не открывая AutoCAD.
У меня есть приложение, основанное на диалоге MFC, написанное на Visual C++ 2005, и из этого приложения я хотел бы получить доступ к метаданным (таким как автор, дата создания и т. Д.) Данного файла. Это было сделано 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 }
Suprisingly SUCCEEDED(hr)
возвращает true после исключения. Где я сделал ошибку и как ее найти?
Спасибо tgwilk
1 ответ
Я не решил эту конкретную проблему, но узнал, что мне не нужен Windows Search для получения метаданных файла. Ключевое слово, которое нужно искать, это "свойства" вместо метаданных. Я получил свой фрагмент кода из примера приложения Windows SDK v7.0 с именем PropertyEdit.