Lesen Sie Dateimetadaten über die Windows-Suche aus dem MFC-Programm
-
13-12-2019 - |
Frage
Ich möchte Metadaten einer DWG/AutoCAD-Datei über den Windows Search-Indizierungsdienst lesen.Ich spreche von Eigenschaften, auf die mit der rechten Maustaste im Explorer zugegriffen werden kann, ohne AutoCAD zu öffnen.
Ich habe eine auf MFC-Dialogen basierende Anwendung, die in Visual C++ 2005 geschrieben ist, und möchte von dieser App aus auf Metadaten (wie Autor, Erstellungsdatum usw.) der angegebenen Datei zugreifen.Dies wurde von iFilter durchgeführt, ist jedoch seit Windows XP veraltet und wird in Windows 8 nicht mehr verwendet (und LoadIFilter ist in VS2005 nicht vorhanden).Soweit ich weiß, ist dies mit der Windows-Suche möglich. Korrigieren Sie mich, wenn ich falsch liege.Jedes Beispiel, das ich gefunden habe (einschließlich MSDN), zeigt jedoch, wie man Daten über seine eigenen Dateien zur Indizierung an die Windows-Suche weitergibt.Ich muss wissen, wie ich Windows Search nach Metadaten für eine bestimmte Datei fragen kann.
Danke Tgwilk
BEARBEITEN:Folgendes habe ich bisher herausgefunden:
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
Die Verbindungszeichenfolge (constr) ist
provider=Search.CollatorDSO.1;EXTENDED PROPERTIES="Application=Windows"
wie von ISearchQueryHelper zurückgegeben.Und die Abfrage (querystr) ist
SELECT System.Document.DateCreated FROM SystemIndex WHERE System.FileName LIKE 'filename%' AND DIRECTORY='file:C:\path\to\file'
Das Problem ist jetzt, dass ich eine Ausnahme bekomme:
First-chance exception at 0x77c5fc56 in fraudTest.exe: Microsoft C++ exception: CNLBaseException at memory location 0x0012d6d0..
auf dieser Linie
hr = con->Open( bconstr, NULL, NULL, 0 );
gefolgt vom leeren Ergebnis der Abfrage (dieser Code stammt von WSQ_GetCDate):
rs->get_EOF( &eor );
while ( eor != VARIANT_TRUE ) { //this never executes }
Überraschenderweise SUCCEEDED(hr)
gibt nach der Ausnahme true zurück.Wo habe ich einen Fehler gemacht und wie kann ich ihn finden?
Danke Tgwilk
Lösung
Ich habe dieses spezielle Problem nicht gelöst, aber ich habe gelernt, dass ich die Windows-Suche nicht benötige, um die Dateimetadaten abzurufen.Das Schlüsselwort, nach dem gesucht werden muss, ist „Eigenschaften“ statt Metadaten.Ich habe meinen Code aus der Windows SDK v7.0-Beispielanwendung mit dem Namen PropertyEdit erhalten.