8 oct 2005

08/10/05: Cronómetro MSN Messenger

Diario de Guerra de Alejandro González, Alias "WaaghMan". Centesimodecimooctava anotación:

Hoy por la mañana se me ocurrió que, si el emule podía mostrar en el messenger la velocidad de descarga, yo podría poner un contador de tiempo que mostrase, por ejemplo, cuantos días quedan para que se encuentre disponible al público el ragdoll kung fu.

Tras tener la idea y decidirme a hacerla, lo primero fue comprobar cómo lo hacía el emule para modificar ese texto. No fue difícil, porque como el emule es de código abierto, me bastó con bajarme las fuentes y buscar alguna referencia al messenger por ellas.

Una vez encontrado el código (no mucho, 5 o 6 líneas), y viendo que lo entendía, me surgió el primer problema: El código estaba en C++, y yo, aunque sé de C++, no sé de ventanas de Windows con C++ :P. Y claro, hacer una aplicación en modo consola pues como que no es plan. Así que, tras intentarlo y ver que era incapaz de mostrar ni un simple botón, me puse a intentarlo con c#.

La cosa fue chunga, muy chunga: Como acceder a la memoria de otro proceso no es una cosa que una máquina virtual vaya a permitir, hay que usar código no administrado. Pero, además, los tipos que utilizan las llamadas que tenía que usar, no eran tampoco estándar.

Tras mil intentos, llegué a detectar el proceso del messenger, la primera parte de la operación. Pero la segunda, la de mandarle los datos para que los muestre, no fui capaz a hacerlo.

Así que, de nuevo, nos volvemos a C++. Tras intentarlo sin éxito, me fijé que el Visual Studio .NET permite usar el C++ con la plataforma .NET, y así se podían hacer ventanas y cosas de esas fácilmente (aunque no tan fácilmente como con c#). Por fin algo parecía que iba a funcionar.

Pero no duró mucho. Tras hacer un interfaz aceptable, hubo que enlazar la función del messenger con esa interfaz, y se llegó a un conflicto de tipos: Mientras que la interfaz usaba una clase String que encapsulaba todo (de forma un pelín cutre), la llamadita usaba un array de caracteres anchos (unicode).

Y no crean que es fácil el cambio: Los arrays y punteros no se llevan nada bien con los tipos de datos administrados de .NET. Tras hacer mil pruebas, llegué a una solución de compromiso, cutre pero eficaz: Recorrer el puto array, tanto para leer como para escribir.

En fin, tras mil problemas y dos mil soluciones, llegué a tener un producto final funcional, relativamente usable (sólo es un icono en la bandeja del sistema), que usa pocos recursos (una pequeña operación por segundo), etc.

Lo que me joroba es que, para sacarle el jugo a un código que ocupa 5 o 6 líneas, he tenido que estar unas cuantas horas (el proyecto en total han sido unas 6 horas) pegándome con lenguajes, la api de windows, los tipos administrados y sin administrar, y mil cosas más, con los que no quería pegarme...

En fin, pues eso, que al final el trabajo dio sus frutos, y aquí tenéis la aplicación para descarga si la queréis.

Cualquier duda o sugerencia que tengáis es bienvenida :).

5 comentarios:

Abe dijo...

Ala, un par de días sin darle a 'actualizar' en los blogs y te encuentras con miles de posts :P

Manda el programa a alguna web de estas de emoticonos del msn, igual no tienen nada así

Anónimo dijo...

Se te podía ocurrir poner el fuente, ya que tienes todo pirateado, al menos devolver algo a la comunidad.

WaaghMan dijo...

Créeme, la humanidad está mejor sin ese código fuente :P. Si quieres el código que de verdad importa (el de cambiar la línea de lo que estás escuchando en el messenger), puedes obtenerlo buscando en google o en el código fuente de la última versión del emule phoenix

Anónimo dijo...

el programa no me funciona me sale un error que no se como arreglarlo o mejor dicho no se si se puede arreglar.


se puede hacer algo?


salu2

Anónimo dijo...

el programa no me funciona me sale un error que no se como arreglarlo o mejor dicho no se si se puede arreglar.se puede hacer algo?salu2