DLL y Punteros


([N1] gerard) #1

Hola, es posible con V7 Usar punteros en las Dll’s?
Hay algún manual?

gracias


([N4] bitcodesoft) #2

No, no es posible utilizar punteros, pero puedes asignar memoria desde la DLL y devolver el puntero como un unsigned long, de esta forma engañas a Velneo.


([N1] VictorMC) #3

Hola a todos,

Gerard, Bitcode se refiere a que tienes que crear tu propia DLL…

Respecto a eso, quizá pasando un unisgned long se pase una copia pero el puntero como tal no pasa, algunas funciones pueden dar resultado, otras no, depende de la DLL (como esté programada) ten en cuenta que hay que liberar la memoria para tal caso puedes utilizar una variable global.

Además de reservar memoria, puedes declarar la variable como static o incluso algunas DLL permiten Retornar el valor utilizando un parámetro de la función llamadora :wink:

Aveces sí la memoria almacenada no se libera, esto puede causar problemas posteriores. Igual ten cuidado al crear la función para liberar memoria, ya que a veces se cree que copiando el contenido en memoria y pasándolo como parámetro se puede lanzar un free() pero no siempre es así. Aunque se cree una función para ello, no se libera si no se realiza la referenciación… puedes investigar sobre ello.

Desde luego esto es en tu propia DLL en C++, con la cual llamarás a la DLL que quieras usar. :wink:

Saludos cordiales a todos los vEmprendedores.

Víctor Martínez Cortés.
www.livesoftmx.com


([N4] bitcodesoft) #4

unsigned long _stdcall stringMalloc(int size)
{
char* cadena = (char ) malloc((size+1) sizeof(char));
// Asignamos espacio y retornamos su direccion de memoria
ZeroMemory( cadena, size);
return (unsigned long)cadena;
}

char* _stdcall getString(unsigned long address)
{
// Retornamos el contenido de la dirección creada con stringMalloc
return (char*) address;
}

void _stdcall freeString(unsigned long address)
{
// Liberamos la memoria reservada con stringMalloc
free((void *)address);
}

El valor numérico(unsigned long) devuelto por stringMalloc, lo puedes utilizar como parámetro en la función de la DLL que necesites, la función modificará la variable sin problemas (siempre que sea de tipo char*).

Para obtener el valor modificado, utilizas getString, y para liberar la memoria asignada se utiliza freeString, un puntero no es más que una dirección de memoria, no la memoria en si.

Espero que te sirva de ayuda.


([N1] VictorMC) #5

Hola de nuevo a todos,

Primero a clarar que tengo un gran respeto por todos los miembros de la comunidad, en especial a muchos que aportan gran conocimiento a este espacio, por lo que jamás será mi intención de contrariar con nadie ni menospreciar sus conocimientos.

Además esto no es un foro de C/C++ Por lo que esta será mi última respuesta a este tema en particular.

Bitcodesoft, efectivamente esa propuesta la presentó José María González Vera en su sitio exprimiendo Velneo: http://exprimiendovelneo.wordpress.com/2008/04/21/velneo-dlls-y-cadenas/
Hace algunos ayeres…

Y yo también lo utilicé en un par de casos, sin embargo en algunas cosas no me funcionó como debía y estudie más a fondo el tema…

Hoy estoy convencido que (al menos lo que yo hacía) no era lo que yo creía que hacía… y estas practicas es algo de ello.

Aquí una referencia de lo comentado casi al final del artículo
http://www.chuidiang.com/clinux/funciones/punteros.php

También revisar tema sobre puntero y su contenido.

Bitcodesoft felicidades por tu trabajo.

Saludos cordiales a todos y todas. :slight_smile:


([N4] bitcodesoft) #6

VictorMC, un puntero es una dirección en memoria, utilizando este sistema yo nunca he tenido problemas, por supuesto, tienes que tener cuidado con el tamaño de memoria que asignas, si asignas 1024 bytes y luego la función que utiliza dicho puntero copia 2000 pues tendrás problemas.

El enlace que pones al final del post, es básico, si devuelves un puntero que apunta a una variable local de la función pues la has fastidiado, si intentas copiar algo utilizando un puntero que ya ha sido liberado pues otro error gordo, pero esto un programador en c/c++, no lo hace en la vida.

Resumiendo, si llamas a las funciones por su orden: stringMalloc, getString, freeString, no tendrás ningún problema, teniendo en cuenta que la memoria que asignes sea suficiente para recibir los datos que se van a copiar en dicha variable.


([N1] Roberto Blasco) #7

Si utilizas la clase String no tendrás problemas de memoria. No olvides que la variable retorno debe estar fuera del cuerpo de la función para que esta no pierda su valor al cerrar el hilo de ejecución de la función (valga la redundancia …)