문제

Windows 검색 인덱싱 서비스를 통해 DWG / AutoCAD 파일의 메타 데이터를 읽고 싶습니다. AutoCAD를 열지 않고 탐색기에서 오른쪽 클릭으로 액세스 할 수있는 속성에 대해 이야기하고 있습니다.

Visual C ++ 2005에서 작성된 MFC 대화 상자 기반 응용 프로그램이 있으며이 응용 프로그램 내부에서 주어진 파일의 메타 데이터 (예 : 작성자, 작성 날짜 등)에 액세스하려고합니다. 이는 IFilter에 의해 수행되었지만 Windows XP 이후로 더 이상 사용되지 않으며 Windows 8에서 사라졌습니다 (및 Loadifilter는 VS2005에 없습니다). 이제는 내가 이해하는 것에서, Windows 검색에서 수행 할 수 있습니다 - 내가 틀렸다면 나를 바로 잡을 수 있습니다. 발견 된 모든 예제 (MSDN Invores)는 인덱싱을 위해 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 }
.

suprisingly SUCCEEDED(hr) 예외 후에 true를 반환합니다. en 오류와 그것을 찾고 찾는 방법은 어디에서 찾았습니까?

고맙습니다 T.G.Wilk

도움이 되었습니까?

해결책

나는이 특별한 문제를 해결하지 못했지만, 파일 메타 데이터를 얻기 위해 Windows 검색이 필요 없다는 것을 알게되었습니다.찾는 키워드는 메타 데이터 대신 "속성"입니다.Windows SDK V7.0 PropertyEdit라는 샘플 응용 프로그램에서 코드 조각이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top