Category: Tips y trucos de Win32


En esta ocasion veremos como crear un elemento para el panel de control de windows y como ejecutar una aplicacion desde esta, los elementos del panel de control nos pueden de ser de utilidad para configuraciones de aplicaciones o servicios. Personalmente lo uso para configurar y manejar el estado de un servicio de windows, es una manera facil para que los usuarios de nuestras aplicaciones puedan usuarlas.

Empezaremos por lo mas imporante, un CPLApplet (Control panel applet) no es mas que una dll comun que por lo general tiene una extesion .cpl y que exporta la funcion CPlApplet (__stdcall) el cual es el punto de entrada para el applet.

La funcion CPlApplet recibe 4 parametros que son los siguientes.

Parametros

hwndCPl
Identificador de la ventana principal. Use el parametro hwndCPl para dialogos u otras ventanas que requieran un manejador de la ventana padre.
uMsg
El mensaje enviado al “Control Planel Application”.
lParam1
Informacion adicional para un mensaje especifico.
lParam2
Informacion adicional para un mensaje especifico.

Ya que conocemos los parametros recibidos por la funcion, vamos a ver los tipos de mensajes que recibe uMsg.

Control Panel messages.

CPL_DBLCLK:
Mensaje enviado cuando el usuario selecciona un icono asociado a un elemento del panel de control, el valor del parametro Param1 indica el valor del indice del elemento, el valor del parametro lParam2 es un puntero a una estructura CPLINFO or NEWCPLINFO regresada por el mensaje CPL_INQUIRE o CPL_NEWINQUIRE. El valor regresado es ignorado.

CPL_EXIT:
Mensaje enviado despues del ultimo mensaje CPL_STOP, Windows usa FreeLibrary para liberar la dll y sus respectivos recursos. El valor regresado es ignorado.

CPL_GETCOUNT:
Mensaje enviado despues de CPL_INIT, debe regresar el numero de subprogramas soportados.

CPL_INIT:
Mensaje enviado despues de ser cargado el elemento en el panel de control.

CPL_INQUIRE:
Mensaje enviado despues de
CPL_GETCOUNT, debe proveerse la informacion especifica de cada subprograma, el valor del parametro lParam1 indica el indice del subprograma, el valor del parametro lParam2 es un puntero a una estructura CPLINFO. El valor de regreso es ignorado.

CPL_NEWINQUIRE:
Mensaje similar a CPL_INQUIRE.

CPL_STARTWPARMS:
Mensaje similar a CPL_DBLCLK.

CPL_STOP:
Envia un mensaje para deter el elemento del panel del control para antes de descargar la extesion del panel de control.

Bien ahora que ya conocemos la estructura de la funcion CPlApplet, vamos a crear un ejemplo en VS2008, tambien puede usar Visual C++ express edition, o su compilador de C/C++ favorito.
Vamos a crear una dll convencional y a incluir el archivo cpl.h el cual contiene los mensajes e informacion necesaria del cplapplet.

#include <cpl.h>

Y a escribir el codigo correspondiente usando la funcion mencionada anteriormente y exportandola.

En el ejemplo que escribi el applet muestra la calculadora de Windows, ustedes pueden mostrar un dialogo o ventana escrito en la misma dll, pero eso no se limita ahi, como esta en el ejemplo pueden llamar a una ventana de configuracion escrita en .Net, etc…

Veamos una captura de pantalla de como se muestra nuestro elemento en el panel de control.

cplapplet

Les dejo aqui el ejemplo.

Cualquier comentario o duda a [me (en) hard-bit.net]

Redistribuibles o paquetes

Al momento de hacer el "deploy" de nuestra aplicación debemos instalar dependencias como .Net, Crystal reportes, entre otros, para eso tenemos un directorio del SDK que se instala con VS2008 el cual contiene los siguientes paquetes, como se puede ver en la captura de pantalla.

packages

Es un tip para no descargar de la pagina de MS los paquetes, les comento que en VS2005 se encontraban en un directorio diferente, dentro del directorio del VS, pero en esta versión 2008 cambio, así que no se preocupen siguen existiendo pero en la ruta que vemos en la captura de pantalla.

Hola a todos en esta ocasión voy a tratar un tema que normalmente no se presenta pero hay que estar preparados, lo que vamos a hacer es convertir el código manejado de .net a nativo, en realidad vamos a hacer un wrapper de CIL a código nativo con C usando C++/Cli.

Aunque estoy se puede resolver creando componentes COM, esta puede ser una solución también ;)

Como este ejemplo es para usuario con conocimientos en C++/CLI, .Net y VS algunas cosas no explicare, como es como crear un proyecto o como agregar una referencia.

Bien primero vamos a crear un proyecto en C# del tipo Class library que llamare DLL_Managed y agregaremos una clase que le pondremos Ejemplo como lo muestra la siguiente figura.
ntom_1

En esta clase tenemos 2 métodos uno que no devuelve ningún valor y otro que devuelve una cadena y pide como parámetro otra cadena.

Lo que vamos a hacer es mostrar estas 2 funciones en una dll de código nativo, aquí aclaro que en este ejemplo voy a exportar las funciones solamente y no la clase como tal.
Ahora crearemos un proyecto en C++ del tipo Class library en el apartado CLR que llamare DLL_Native_CLR, VS nos genera archivos iniciales, vamos al archivo de cabecera DLL_Native_CLR.h y ahí escribiremos los prototipos de función que exportaremos como lo muestra la siguiente imagen
ntom_3

Ya que definimos nuestros prototipos de función agregaremos como referencia la dll de .net que creamos anteriormente, ahora vamos a escribir el código así que vamos al DLL_Native_CLR.cpp y escribiremos el siguiente código, primero agregaremos el archivo de cabecera vcclr.h, agregaremos el nombre de espacio de la dll de .net como lo muestra la siguiente figura
ntom_4

En la imagen vemos también las funciones con el código creado para devolver los resultados de los métodos de la clase a las funciones de C.

Compilamos nuestras dlls y ya tenemos una nativa que podemos usar en pascal, C/C++, VB6, etc…
Les dejo un archivo que contiene los ejemplos en un zip.

Pueden usar la herramienta dumpbin para ver las funciones exportadas de la dll
ntom_5

No explicare el código C++/CLI puesto que supongo que el que vaya a hacer este tipo de wrappers tiene conocimientos de este.

Bueno espero eso les haya sido de ayuda y como siempre espero comentarios y/o errores del código ;)

Descarga de ejemplo: DLL_Managed.zip

Powered by WordPress | Theme: Motion by 85ideas.