Java-COM 통합 기술 중 하나를 살펴볼 수 있습니다. (반사와 독점적으로 일하고 생각)
다소 복잡했지만, 나를 위해 수행 할 작업 (개념의 빠른 증거를 가지고 : 나는 개인적으로 JACOB (자바 COM 다리)와 함께 일했다 Java 내에서 MapPoint에 액세스).
내가 Jawin입니다 알고 있어요,하지만 난 그것으로 어떤 개인적인 경험이없는 유일한 등의 기술 :
업데이트 2009년 4월 26일를 : Microsoft Windows Search에 대한 더 많은 연구를 수행했으며 OLE DB를 사용하여 쉽게 통합 할 수있는 방법을 발견했습니다. 여기 개념의 증거로 쓴 일부 코드입니다 :
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이 클래스 경로에 있는지 확인해야합니다, 그리고 그 jawin.dll는 경로에 (또는 자바 .library.path 시스템 특성). 이 코드는 로컬 Windows 데스크톱 검색 인덱스에 대한 ADO 연결을 열고 키워드 "Foo"가있는 문서를 쿼리하고 결과 문서에 몇 가지 주요 속성을 인쇄합니다.
질문이 있거나 알려주는 것이 필요하면 알려주세요.
업데이트 04/27/2009 : 나뿐만 아니라 야곱에서 같은 일을 구현했는데, 둘 사이의 성능 차이를 비교하기 위해 몇 가지 벤치 마크를하고있을 것입니다. 나는 JACOB에서 뭔가 잘못하고있을 수도 있지만 일관되게 10 배 더 많은 메모리를 사용하고있는 것 같습니다. jcom과 com4j 구현에 대해서도 일할 것입니다. 시간이 있다면, 어딘가에 스레드 안전성이 부족하기 때문에 믿을만한 몇 가지 단점을 파악하려고 시도해보십시오. 심지어 JNI 기반 솔루션을 사용해 볼 수도 있습니다.나는 6-8 주 안에 모든 일이 끝나기를 기대합니다.
업데이트 04/28/2009 : 이것은 다음 호기심 많은 사람들을위한 업데이트입니다. OLE DB 연결은 아마도 OS 레벨에서 풀링되었으므로 (아마도 어쨌든 연결을 닫아야 했음), 스레딩 문제가 없다는 것을 알았습니다. 데이터베이스 리소스를 명시 적으로 닫아야했습니다. 나는 이것에 대한 더 이상의 업데이트가 없을 것이라고 생각한다. 누군가가이 문제에 부딪치게되면 알려주십시오.
업데이트 05/01/2009 : Oscar의 요청에 따라 JACOB 예제가 추가되었습니다. 이것은 JACOB을 사용하는 것과 똑같은 COM 관점에서의 동일한 호출 순서를 거친다. 사실 야곱은 훨씬 더 적극적으로 최근에 작업 한되었습니다이지만, 나 또한
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();
}
}
}
윈도우 프로그래밍에 대해 잘 모릅니다. -S 이전에이 라이브러리를 본 적이 있지만 많이 얻지는 못했습니다. 더 이상 나는 다음에 무엇을해야할지 모르겠다. jacob에서 작동하도록 MSDN 설명서에서 샘플 검색을 수행 할 수 있습니까? – OscarRyz
이것은 매우 흥미 롭습니다! 저는 컴퓨터 과학을 공부하는 초보자이고, "창문에 들어가는"것에 대해 더 많이 배울 수 있고, 자바 나 다른 언어에서 그런 것들을 할 수있는 곳이 궁금합니다. 도서 또는 웹 페이지의 제목은 무엇입니까? 나는 msdn을 읽는 데 일을 사용했지만 초보자는 아닙니다. :) – Johannes
저는 Jawin 설명서를 간략하게 살펴본 후 Microsoft에서 제공하는 COM 구성 요소 API 참조를 보았습니다. . 그것은 시작이지만, 더 복잡한 것을 시도한다면 더 많은 문제를 겪게 될 것이라고 생각합니다. –