Java-COM 統合テクノロジの 1 つを参照することをお勧めします。私は個人的に JACOB (JAva COM Bridge) と協力してきました:
これはかなり面倒でしたが (リフレクションのみで作業することを考えてください)、仕事は完了しました (概念の迅速な証明、Java 内から MapPoint へのアクセス)。
私が知っている他のそのようなテクノロジーは Jawin だけですが、個人的な経験はありません。
更新 2009 年 4 月 26 日:
念のため、Microsoft Windows Search についてさらに調査したところ、OLE DB を使用して Microsoft Windows Search と簡単に統合する方法を見つけました。概念実証として私が書いたコードを次に示します。
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 がパス (または java.library.path システム プロパティ) にあることを確認する必要があります。このコードは、単純にローカルの Windows デスクトップ サーチ インデックスへの ADO 接続を開き、キーワード「Foo」でドキュメントをクエリし、結果のドキュメントにいくつかの重要なプロパティを出力します。
ご不明な点がございましたら、お気軽にお問い合わせください。
2009 年 4 月 27 日更新:
同じことを JACOB にも実装してみました。2 つのパフォーマンスの違いを比較するために、いくつかのベンチマークを行う予定です。JACOB で何か間違ったことをしている可能性がありますが、一貫して 10 倍のメモリを使用しているようです。時間があれば、jcom と com4j の実装にも取り組み、どこかでスレッド セーフが欠如していると思われるいくつかの癖を見つけようとします。JNI ベースのソリューションを試すこともできます。6〜8週間ですべてが完了すると思います。
更新 2009 年 4 月 28 日:
これは、フォローしていて興味を持っている人のための単なる更新です。OLE DB接続はおそらくOSレベルでプールされているため、スレッドの問題はありません。データベースリソースを明示的に閉じる必要がありました(とにかく接続を閉じる必要がありました...)。これ以上の更新はないと思います。これで問題が発生した場合はお知らせください。
2009 年 5 月 1日更新:
Oscar の要求により、JACOB の例を追加しました。これは、JACOB を使用するだけで、COM の観点からはまったく同じ一連の呼び出しを実行します。確かに、JACOB は最近より積極的に取り組んでいますが、メモリを大量に消費していることにも気付きました (Jawin バージョンの 10 倍のメモリを使用します)。
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();
}
}
}