Es posible que desee ver una de las tecnologías de integración Java-COM. He trabajado personalmente con Jacob (Java Puente COM):
que era bastante engorroso (piensa trabajar exclusivamente con la reflexión), pero consiguió el trabajo hecho por mí (la prueba rápida del concepto, accediendo a MapPoint desde dentro de Java).
El único otro tipo de tecnología yo sepa es Jawin, pero no tengo ninguna experiencia personal con:
Actualización 26/04/2009: Simplemente por pura casualidad investigué más en Microsoft Windows Search y encontré una manera fácil de integrarlo utilizando OLE DB. Aquí hay algo de código que he escrito como una prueba de concepto:
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();
}
}
}
Para compilar este, que necesita para asegurarse de que el JAR Jawin está en la ruta de clases, y que jawin.dll está en su camino (o java propiedad del sistema .library.path). Este código simplemente abre una conexión ADO al índice local de Windows Desktop Search, consulta documentos con la palabra clave "Foo" e imprime algunas propiedades clave en los documentos resultantes.
Avíseme si tiene alguna pregunta o si necesita que le aclare algo.
Actualización 04/27/2009: Probé la ejecución del mismo en JACOB, así, y voy a hacer algunos puntos de referencia para comparar las diferencias de rendimiento entre los dos. Puede que esté haciendo algo mal en JACOB, pero parece que consistentemente está usando 10 veces más memoria. Trabajaré en una implementación de jcom y com4j también, si tengo algo de tiempo, y trataré de descubrir algunas peculiaridades que creo que se deben a la falta de seguridad en el hilo en alguna parte. Incluso puedo probar una solución basada en JNI.Espero terminar con todo en 6-8 semanas.
Actualización 04/28/2009: Esto es solo una actualización para aquellos que han estado siguiendo y curiosos. Resulta que no hay problemas de enhebrado, solo necesitaba cerrar explícitamente los recursos de mi base de datos, ya que las conexiones OLE DB están supuestamente agrupadas en el nivel del sistema operativo (probablemente debería haber cerrado las conexiones de todos modos ...). No creo que haya más actualizaciones de esto. Avíseme si alguien tiene algún problema con esto.
Actualización 05/01/2009: Ejemplo de JACOB agregado por solicitud del Oscar. Esto pasa por la misma secuencia de llamadas desde una perspectiva COM, simplemente usando JACOB. Si bien es cierto JACOB se ha trabajado mucho más activa en los últimos tiempos, también me doy cuenta de que es todo un cerdo de la memoria (utiliza 10 veces más memoria que la versión 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();
}
}
}
Debería haber agregado No sé mucho de la programación de Windows: -S He visto esta biblioteca antes, pero nunca recibí mucha más aún porque no estoy seguro de qué hacer a continuación? ¿Puede hacer que la búsqueda de muestra en la documentación de MSDN funcione con jacob? – OscarRyz
¡Esto fue muy interesante! Soy un novato que está estudiando informática y me pregunto dónde puedo obtener más información sobre ventanas "entrantes" y hacer cosas como esa desde Java o cualquier otro idioma. ¿Algún título para libros o páginas web? He usado días leyendo en msdn, pero no es para principiantes ... :) – Johannes
No conozco ninguno, realmente solo he echado un vistazo rápido a la documentación de Jawin, y luego las referencias de la API del componente COM disponibles de Microsoft . Es un comienzo, pero sospecho que me encontraré con muchos más problemas si estuviera intentando algo más complejo. –