質問
できるような場合Windows Vistaの検索サービスを直接または間接的に)からJava.
っきを利用してクエリの検索-msプロトコルには、消費の結果以内にアプリを開発する予定だ。
って良い情報の Windows検索API な関連をJava.
私はマークとして、その答えを提供する有用かつ決定的な情報をどのように達成します。
よろしくお願いします。
編集
いてジェイコブサンプルの前にできること可能ですか?:)
解決
ているのは、Java-COM統合技術です。私個人として働とジェイコブ(JAva COm橋):
となり、煩雑ないと作用反射)にあり、仕事をしてもらったクイック証コンセプトにアクセスMapPoint内からJava).
どのような技術知識はJawinがまったく泳げないんだけど---個人的経験のないものとします。
更新04/26/2009: にゃがいもあり、多くの研究Microsoft Windows検索することにより、簡単に統合で使用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はclasspathとjawin.dll ご自分のパス(またはjava.図書館があります。パスのシステムプロパティ).このコードで開に対する検査への接続地域のWindowsデスクトップ検索インデックス、クエリのための書類とキーワードは"Foo"を印刷して複数キーのプロパティの結果を提出する。
かご質問があれば、必要かを明確にあります。
更新04/27/2009: また実施に同様のことヤコブとしても、このベンチマークを比較のパフォーマンスの違いる。私がやろうという間違ったジェイコブうですが、一貫して使用10xります。まるjcomとcom4j実施していくの間、試しに一部の操作ることだと思ってい不足によるスレッドの安全性をどこかということです。いくのもいいかもしれJNIに基づく。期待しているすべてのものでは6~8週間までです。
更新04/28/2009: これは単な更新を行者にんて、不思議です。がありませんねじ問題、必要があったので明示的に密なデータベース資源は、OLE DB接ていると考えられる限をOSレベル(そのすべての接続がとにかく...).ないと思いますの他今後のアップデート。私の場合は誰にもスポットとして知られ問題です。
更新05/01/2009: 追加JACOBえたオスカー。このように見えるが、実はその配列からCOMの観点かJACOB.で、ヤコブとしていたより積極的により取り組んできましたが、最近まで知ることでメモリを独り占め(10倍もメモリとして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();
}
}
}
他のヒント
ここではいくつかの記事は、あなたがJACOB、JNBridge、J-インテグラなどのような商用またはフリーフレームワークを使用してJavaと.NETまたはCOM間を橋渡しすることができます示唆したよう.. 実際に私は、これらの第三者(高価な1 :-))のいずれかでの経験を持っていたと私は将来的にこの間違いを繰り返さないために最善を尽くしますと言わなければなりません。その理由は、それはあなたが本当にデバッグすることができ、多くの「ブードゥー」のものを含むことである、それは物事がうまくいかない問題が何であるかを理解することは非常に複雑です。
私はあなたが実装することをお勧めソリューションは、Windowsの検索APIへの実際の呼び出しを行うシンプルな.NETアプリケーションを作成することです。そうしたら、このコンポーネントとJavaコード間の通信チャネルを確立する必要があります。これは、アプリケーションが定期的に引っ張ってくる小さなDBへのメッセージングによって、たとえば、さまざまな方法で行うことができます。またはマシンのIIS上で、このコンポーネントを登録する(もし存在する)と、それと通信するための簡単なWSのAPIを公開します。
、b)は、すべてのアプリケーションパスを制御する)a)のあなたはそれが理解言語(.NETまたはCOMを使用してWindowsの検索APIと通信私はそれが面倒に聞こえるかもしれないが、明確な利点があることを知っています。
あなただけの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オブジェクトを呼び出すためにありますが、一部はオープンソースです(ただし、彼らの学習曲線が高いです)いくつかは、クローズドソースであり、迅速な学習曲線を持っています。クローズドソースの例は、 EZCom にあります。商用のものは、同様に私がオープンソースで見たことがない何かを窓からJavaを呼び出すことに集中する傾向があります。
あなたの場合、私はあなたが行うことをお勧めすることは、独自の.NETクラスでの呼び出しは(私はそれが論争のJ番号に入ることなく、Javaのに最も近いとしての使用のC#を推測)、および相互運用性を作ることに焦点を当てる前です.NETのDLL。その方法は、Windowsプログラミングを簡単に取得し、WindowsとJavaの間のインタフェースが簡単です。
あなたはJavaのCOMライブラリを使用する方法を探している場合は、、MSDNは、間違った場所です。しかし、MSDNはあなたが.NETの中から必要なものを書くため、その後、あなたは.NETオブジェクトから必要な1つのまたは2つのメソッドを呼び出すことについて、COMライブラリのチュートリアルを見ていきます。
EDITます:
、あなたは(そしておそらくより良い運を持っています)埋め込まれたJavaのWebサーバを呼び出すのではなく、.NETが埋め込まれたWebサービスを持って作ってみる小型の.NETアプリケーションを構築できるWebサービスを使用する方法についての回答での議論を考えます、およびJavaは、コールの消費者もいます。内蔵Webサーバーの場合は、私の研究は、・ウィンストンの良いことを示しました。ない最小の、しかし、はるかに柔軟性があります。
仕事にそれを得るための方法は、要求があるかどうかを確認するために、タイマーやループ上のWebサービスを呼び出すJavaから.NETアプリを起動し、.NETアプリケーションを持つことである、と、プロセスが存在する場合それと応答を送信します。