Duda DLLOpen()

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Duda DLLOpen()

Mensaje por Jonny »

Buenas,

Tengo una duda con la función DLLOpen().

¿Como funciona exactamente esta función?.

Quiero decir, que hace con la DLL: ¿La carga en el proceso actual con LoadLibrary() o LoadLibraryEX() de la API de Windows?. Supongo que sí...

Entonces, de hacer eso: ¿La DLL puede guardar datos en memoria, para usar entre llamada y llamada a sus funciones?.

Por ejemplo, si la DLL tiene las funciones:
_SetValue()
_GetValue()
Si _SetValue() recibe un valor y lo almacena en una variable global de la DLL, y _GetValue() recupera el valor de esa variable global de la DLL y lo devuelve ¿Se mantendría el dato en memoria desde que se carga la librería con DLLOpen() y se guarda con _SetValue() hasta que se descargue la DLL con DLLClose()?.

¡espero se me entienda! ;).

Salu2!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Duda DLLOpen()

Mensaje por Ximorro »

DLLOpen hace un referencia a la DLL para que los accesos desde AutoIT sean más rápidos.
Al hacer la referencia provoca que si la librería no está cargada la cargará en memoria.
DLLClose cierra la referencia, si las referencias de la librería quedan a cero pues Windows puede descargarla de memoria.

Si se trata de una dll del sistema, tipo, kernel32, user32 o compañía, seguramente ya están abiertas y simplemente se les añade una referencia de acceso más. Como tienen tantos accesos al cerrarlas con DLLCLose seguramente no serán descargadas de memoria, pues el propio sistema u otras aplicaciones seguro que las están usando.

No creo que todo esto tenga que ver con el acceso de la librería a sus objetos o variables, está claro que la librería puede acceder a sus datos independientemente de cómo ha sido abierta. Lo que sí sería interesante es saber si un DLLClose invalidaría esa información.

Puedes hacer la prueba, ya que estabas haciendo DLLs.
Simplemente haz una con una función que reciba un número de AutoIT y lo guarde en una variable global.
Y otra función que te devuelve ese número desde la variable.

Desde AutoIT abres la librería, le das el número, la cierras, la vuelves a abrir y miras a ver si te da el número inicial.
También será interesante probar sin DLLOpen y DLLClose, poniendo el nombre de la DLL en las llamadas (por si cada llamada abre y cierra la dll).
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder