문제

를 쿼리하는 윈도우 Vista 검색 서비스는 직접(또는 간접적으로)에서 Java.

저는 이것이 가능한 쿼리를 사용하여 검색-ms:프로토콜,그러나 나는 것 같은 소비하는 결과 내용.

내가 찾는 좋은 정보 Windows 검색 API 관 Java.

나는 것으로 표시를 받아들이 대답이 제공하는 유용한 명확한 정보를 달성하는 방법이다.

미리 감사드립니다.

편집

지 야곱에 샘플 전에 표시 할 수 있습니다 이것으로 받아들였습니까?:)

도움이 되었습니까?

해결책

Java-Com 통합 기술 중 하나를보고 싶을 수도 있습니다. 저는 개인적으로 Jacob (Java Com Bridge)과 함께 일했습니다.

다소 번거 롭습니다 (반사로 독점적으로 일한다고 생각). 그러나 작업을 수행했습니다 (Java 내에서 Mappoint에 액세스하는 개념 증명서).

내가 알고있는 유일한 기술은 Jawin이지만 개인적인 경험이 없습니다.

2009 년 4 월 26 일 업데이트 :그로 인해 Microsoft Windows 검색에 대해 더 많은 연구를 수행했으며 OLE DB를 사용하여 IT와 쉽게 통합 할 수있는 방법을 찾았습니다. 다음은 개념 증명으로 작성한 몇 가지 코드입니다.

public static void main(String[] args) {
    DispatchPtr connection = null;
    DispatchPtr results = null;
    try {
        Ole32.CoInitialize();
        connection = new DispatchPtr("ADODB.Connection");
        connection.invoke("Open",
            "Provider=Search.CollatorDSO;" +
            "Extended Properties='Application=Windows';");
        results = (DispatchPtr)connection.invoke("Execute",
            "select System.Title, System.Comment, System.ItemName, System.ItemUrl, System.FileExtension, System.ItemDate, System.MimeType " +
            "from SystemIndex " +
            "where contains('Foo')");
        int count = 0;
        while(!((Boolean)results.get("EOF")).booleanValue()) {
            ++ count;
            DispatchPtr fields = (DispatchPtr)results.get("Fields");
            int numFields = ((Integer)fields.get("Count")).intValue();

            for (int i = 0; i < numFields; ++ i) {
                DispatchPtr item =
                    (DispatchPtr)fields.get("Item", new Integer(i));
                System.out.println(
                    item.get("Name") + ": " + item.get("Value"));
            }
            System.out.println();
            results.invoke("MoveNext");
        }
        System.out.println("\nCount:" + count);
    } catch (COMException e) {
        e.printStackTrace();
    } finally {
        try {
            results.invoke("Close");
        } catch (COMException e) {
            e.printStackTrace();
        }
        try {
            connection.invoke("Close");
        } catch (COMException e) {
            e.printStackTrace();
        }
        try {
            Ole32.CoUninitialize();
        } catch (COMException e) {
            e.printStackTrace();
        }
    }
}

이를 컴파일하려면 Jawin Jar가 ClassPath에 있고 Jawin.dll이 경로에 있는지 확인해야합니다 (또는 Java.library.path 시스템 속성). 이 코드는 단순히 로컬 Windows Desktop 검색 색인에 대한 ADO 연결을 열고 키워드 "FOO"가있는 문서 쿼리 및 결과 문서에 몇 가지 주요 속성을 인쇄합니다.

궁금한 점이 있거나 명확히 해야하는지 알려주세요.

2009 년 4 월 27 일 업데이트 :Jacob에서도 같은 것을 구현하려고 시도했으며, 둘 사이의 성능 차이를 비교하기 위해 벤치 마크를 수행 할 것입니다. 야곱에서 뭔가 잘못하고 있을지 모르지만 지속적으로 10 배 더 메모리를 사용하는 것 같습니다. 시간이 있다면 JCOM 및 COM4J 구현도 작업하고 나사회 안전이 부족하기 때문이라고 생각하는 몇 가지 단점을 알아 내려고 노력할 것입니다. JNI 기반 솔루션을 시도 할 수도 있습니다. 나는 6-8 주 안에 모든 일을 할 것으로 기대합니다.

업데이트 04/28/2009 :이것은 따르고 호기심 많은 사람들을위한 업데이트 일뿐입니다. 스레딩 문제가 없다는 것이 밝혀졌습니다. OLE DB 연결이 아마도 OS 레벨에서 풀링 되었기 때문에 데이터베이스 리소스를 명시 적으로 닫아야했습니다 (어쨌든 연결을 닫아야 할 것입니다 ...). 나는 이것에 대한 추가 업데이트가 될 것이라고 생각하지 않습니다. 누군가가 문제를 해결하는 경우 알려주십시오.

업데이트 05/01/2009 :오스카의 요청에 따라 Jacob 예제가 추가되었습니다. 이것은 Jacob을 사용하여 COM 관점에서 똑같은 순서의 호출을 거칩니다. Jacob은 최근에 훨씬 더 적극적으로 작업 한 것이 사실이지만, 나는 또한 메모리 돼지라는 것을 알 수 있습니다 (Jawin 버전만큼 많은 메모리를 사용합니다).

public static void main(String[] args) {
    Dispatch connection = null;
    Dispatch results = null;

    try {
        connection = new Dispatch("ADODB.Connection");
        Dispatch.call(connection, "Open",
            "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';");
        results = Dispatch.call(connection, "Execute",
            "select System.Title, System.Comment, System.ItemName, System.ItemUrl, System.FileExtension, System.ItemDate, System.MimeType " +
            "from SystemIndex " +
            "where contains('Foo')").toDispatch();
        int count = 0;
        while(!Dispatch.get(results, "EOF").getBoolean()) {
            ++ count;
            Dispatch fields = Dispatch.get(results, "Fields").toDispatch();
            int numFields = Dispatch.get(fields, "Count").getInt();

            for (int i = 0; i < numFields; ++ i) {
                Dispatch item =
                    Dispatch.call(fields, "Item", new Integer(i)).
                    toDispatch();
                System.out.println(
                    Dispatch.get(item, "Name") + ": " +
                    Dispatch.get(item, "Value"));
            }
            System.out.println();
            Dispatch.call(results, "MoveNext");
        }
    } finally {
        try {
            Dispatch.call(results, "Close");
        } catch (JacobException e) {
            e.printStackTrace();
        }
        try {
            Dispatch.call(connection, "Close");
        } catch (JacobException e) {
            e.printStackTrace();
        }
    }
}

다른 팁

로 여기 게시물을 제안할 수 있습리 Java.NET 또는 COM 를 사용하여 상업적 또는 무료 프레임워크 야곱과 같이,JNBridge,J-Integra 등등....실제로 있었는 경험 중 하나로 함께 이러한 제삼자(비싼 것:-))그리고 내가 말해야겠을 피하기 위해 최선을 반복되 이에 실수를 미래입니다.그 이유는 그것을 포함한 많은"voodoo"물건을 디버깅,그것은 매우 복잡하이 무엇인지 이해하는 문제 때는 일이 잘못된다.

솔루션 내가 당신을 구현하는가를 만드 간단합니다.NET 프로그램이 실제 호출 windows 검색 API 를 사용한다.그렇게 하고,당신을 설정해야 커뮤니케이션 채널이 구성 요소와 자바 코드입니다.이 수 있는 다양한 방법으로 수행하여 예를 들어,메시징은 작은 DB 그 응용 프로그램은 주기적으로 당깁니다.또는 등록이 구성 요소에는 기계 IIS(존재하는 경우)그리고 간단한 노출 WS API 를 통신습니다.

내가 알고있는 그것은 번거롭지만 분명한 장점은 다음과 같습니다:a)통신 windows 검색 API 를 사용하는 언어로 그것을 이해(.NET 또는 COM)b)모든 응용 프로그램 경로입니다.

당신이 그냥 사용할 수 없었던 이유 Runtime.exec() 쿼리 search-ms 그리고 읽으십시오 BufferedReader 명령의 결과로? 예를 들어:

public class ExecTest {
    public static void main(String[] args) throws IOException {
        Process result = Runtime.getRuntime().exec("search-ms:query=microsoft&");

        BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
        StringBuffer outputSB = new StringBuffer(40000);
        String s = null;

        while ((s = output.readLine()) != null) {
            outputSB.append(s + "\n");
            System.out.println(s);
        }

        String result = output.toString();
    }
}

Java에서 COM 객체를 호출하기위한 여러 라이브러리가 있으며 일부는 OpenSource (그러나 학습 곡선이 더 높음) 일부는 닫힌 소스이며 더 빠른 학습 곡선이 있습니다. 닫힌 소스 예는 다음과 같습니다 ezcom. 상업용은 OpenSource에서 본 적이없는 Windows에서 Java를 부르는 데 집중하는 경향이 있습니다.

귀하의 경우, 내가 제안하는 것은 자신의 .NET 클래스에서 전화를 앞면 (논란의 여지가있는 J#에 들어 가지 않고 Java에 가장 가까운 C#을 사용하는 것 같아요). . 이렇게하면 Windows 프로그래밍이 쉬워지고 Windows와 Java 간의 인터페이스가 더 간단합니다.

Java Com 라이브러리를 사용하는 방법을 찾고 있다면 MSDN이 잘못된 장소입니다. 그러나 MSDN은 .NET 내에서 필요한 것을 작성한 다음, .NET 객체에서 필요한 하나 또는 두 개의 메소드를 호출하는 것에 대한 COM 라이브러리 자습서를 살펴 보는 데 도움이됩니다.

편집하다:

웹 서비스 사용에 대한 답변에 대한 논의가 주어지면 .NET이 내장 웹 서비스를 갖고있는 것이 아니라 내장 된 Java 웹 서버를 호출하는 작은 .NET 앱을 구축 할 수 있습니다. Java는 전화의 소비자가됩니다. 내장 된 웹 서버의 경우 내 연구에서 보여주었습니다 윈스톤 좋게. 가장 작지는 않지만 훨씬 더 유연합니다.

이를 수행하는 방법은 Java에서 .NET 앱을 시작하고 .NET 앱이 타이머 또는 루프에서 웹 서비스를 호출하여 요청이 있는지 확인하고 처리하고 보내는 경우입니다. 응답.

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