Archive for the ‘Avanzado’ Category

Usando dlls de Windows desde Velneo V7

Hace algún tiempo que quería escribir sobre cómo usar las dlls nativas de Windows (user32, kernel, etc) desde Velneo V7 usando el objeto librería externa.

No voy a pararme en como crear el objeto, las funciones y sus parámetros, ya que eso está perfectamente explicado en la zona info de www.velneo.es. En este artículo mostraré un par de ejemplos de uso de la dll user32 y doy acceso a la Velneo Open App que he creado para este artículo.

Lo primero que hay que tener en cuenta en la declaración del objeto Sigue leyendo

Anuncios

Velneo, dll’s y cadenas

Cuando trabajamos con Velneo y necesitamos hacer una llamada a una dll que retorna una cadena (string) nos encontramos con la tesitura de como liberar el espacio de memoria alojada para la cadena en cuestión en la dll. Veamos un método, que no el único, para liberar esa memoria. Este método sólo va a servir para las dlls que creemos nosotros, ya que debemos añadir un par de funciones extra.

El escenario

Veamos el escenario que vamos a utilizar para poner en funcionamiento nuestra técnica. Tenemos un mapa en Velneo desde el que necesitamos llamar a una función de una dll que debe retornar una cadena de caracteres (un char*). La cadena no tiene una longitud fija, por lo que nos interesa alojar el espacio en memoria en la propia función de la dll y retornar la cadena completa.

La solución

Lo primero que se nos ocurre es hacer una función que retorne un char* y recogerlo en Velneo, pero tenemos que ser conscientes de que ese espacio en memoria no se a a liberar, por lo que estamos dejando un motón de basura.

Lo que vamos a hacer es retornar el puntero a ese char*, y nos creamos dos funciones extra en la dll, getString y freeString. El código en C sería algo así:
unsigned long test(int variables, ...)
{
char* cadena = (char *) malloc(1024);
// Procesamos la cadena y retornamos su direccion de memoria
return (unsigned long)cadena;
}


char* getString(unsigned long address)
{ // Retornamos el contenido de esa dirección
return (char*) address;
}


void freeString(unsigned long address)
{ // Liberamos esa dirección de memoria
free((void *)address);
}

Desde Velneo haremos las llamadas en el siguiente orden:

Set ptr_cadena, testDll.test('variables')
// En esta variable local tenemos la direccion de memoria. Obtengamos el contenido
Set cadena, testDll.getString('ptr_cadena')
// Liberemos ese espacio reservado
Set void, testDll.freeString('ptr_cadena')

Con esta sencilla artimaña nos aseguramos de que no quede espacio en memoria ocupada sin liberar.

Esta es la opción que yo utilizo. Si usas algún otro truco, aprovecha para compartirlo con la comunidad escribiendo un comentario.