Haciendo que Digi3D x64 pueda controlar Google Earth

Las versiones de Digi3D.NET de 64 bits nunca se han podido comunicar con Google Earth.

Ayer por la mañana me propuse solucionar el problema. Ha sido un día entero de frustración que te explico aquí. Hoy por la mañana por fin he dado con la solución.

Si quieres ordenar a Google Earth que haga cosas, como por ejemplo que desplace la cámara a una determinada posición, tienes que hacerlo mediante Component Object Model.

Hacer eso es trivial, primero necesitas tener acceso a los tipos que enumera el servidor COM, Visual Studio te lo facilita con la directiva #import.

Lo que no soluciona Visual Studio de forma automática es el problema que se presenta en Digi3D x64 al conectarse con el servidor COM. El problema es el siguiente:

Google Earth es una aplicación de 32 bits y se comporta como un servidor COM de tipo Inproc Server

Lo importante aquí es que se comporta como un Inproc Server, y eso significa que no deja de ser una DLL que se adjunta al proceso de la aplicación que la instancia (vamos que forma parte del mismo proceso). Si una aplicación es de 64 bits, las DLLs que cargue tienen que ser de 64 bits, no puede cargar una de 32 bits, independientemente de cómo se cargue esa DLL (LoadLibrary que sería la forma normal o mediante CoCreateInstance que es el método que se utiliza con COM).

La solución sería instalar una versión de 64 bits de Google Earth para que Digi3D.NET de 64 bits si que pueda localizar el servidor COM de 64 bits, pero no pierdas el tiempo (ya lo he perdido yo por ti), no existe una versión de 64 bits de Google Earth.

La única solución es hacer que Google Earth sea un Out-of-proc Server, y eso significa que el servidor COM sea un ejecutable y no una DLL. Cuando instancias un Out-of-proc Server, Windows se encarga de todo lo necesario para poder comunicar la aplicación cliente de 64 bits con el servidor de 32. En este caso es posible porque son dos procesos distintos, por lo tanto el servidor ya no forma parte del cliente, y por lo tanto existen mecanismos de comunicación entre procesos que compatibilizan ambas plataformas.

Como no puedo modificar Google Earth para que sea un Out-of-proc server (porque si tuviera el código fuente de Google Earth obviamente lo compilaría en 64 bits y me olvidaría del problema), no queda más remedio que desarrollar un intermediario (que llamaré Proxy) entre Digi3D.NET y Google Earth.

Este proxy va a ser un servidor COM Out-of-proc y va a implementar un interfaz con los métodos que requiere Digi3D.NET para poder ordenar a Google Earth a que se desplace a unas determinadas coordenadas.

Puedes descargar el código fuente del proyecto de nuestro repositorio de código fuente en nuestro repositorio de código fuente GitHub,  Básicamente creamos el servidor como un proyecto de tipo ATL, y luego hacemos una aplicación cliente que nos va a servir a comprobar que funciona.

…y como una imagen vale más que mil palabras, aquí tienes el vídeo en el que desarrollo esa solución. Espero que te guste.

[youtube:https://youtu.be/6KSbIZUgJVs%5D

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s