PDA

Ver la Versión Completa : FreeLibrary


Ricardo León
06-10-2005, 16:35:22
HOLA A TODOS...

ALGUIEN ME PUEDE EXPLICAR PARA QUE SIRVE O COMO FUNCIONA LA FUNCION FreeLibrary ? NO ESTOY SEGURO SI SIRVE PARA DESCARGAR DE MEMORIA CUALQUIER LIBRERIA O SOLO LAS DEL SISTEMA

dec
06-10-2005, 16:39:37
Hola,

En la ayuda del SDK de Win32 (disponible desde el menú de ayuda para Delphi) encontrarás la descripción de la función que mencionas. No la transcribiré aquí, porque no es cuestión de un par de líneas. En todo caso no hacía falta que gritaras, que te escuchamos igual. Echa un vistazo a la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) de los Foros. ;)

Neftali [Germán.Estévez]
06-10-2005, 17:02:46
NO ESTOY SEGURO SI SIRVE PARA DESCARGAR DE MEMORIA CUALQUIER LIBRERIA O SOLO LAS DEL SISTEMA
Antes de nada, lo dicho, revisa la Guía de Estilo.
Como bien apuntas, ésta función permite descargar librerías de memoria.
No tienen que ser necesariamente de sistema, es más, los packages de Delphi (BPL) que son librerías (un poco especiales) se descargan de memoria utilizando UnloadPackage. Éste procedimiento llama (además de hacer alguna otra cosa) a FreeLibrary.


procedure UnloadPackage(Module: HMODULE);
begin
FinalizePackage(Module);
{$IFDEF MSWINDOWS}
FreeLibrary(Module);
{$ENDIF}
{$IFDEF LINUX}
dlclose(Pointer(Module));
InvalidateModuleCache;
{$ENDIF}
end;

Ricardo León
06-10-2005, 18:24:40
Tengo otra duda:

Al utilizar la función FreeLibrary se debe primero hacer el cargue de la dll para obtener su identificador (por decirlo asi) con la función LoadLibrary('dllhost.exe')

Ejemplo:
libreria:= LoadLibrary(ConfigInicial.dll');
FreeLibrary(libreria);

Mi duda es si tengo que indicar la ruta donde se encuentra la dll o no? puesto que esta es una dll de un servicio web que tengo montado en IIS.

dec
06-10-2005, 18:31:02
Hola,

Tal vez algo así podría ser lo suyo:


// unload file (if its loaded) so we can remove all traces
if (GetModuleHandle(PChar(FileName)) <> 0) then
FreeLibrary(GetModuleHandle(PChar(FileName)));

Donde "FileName" sería la librería a liberar.

Neftali [Germán.Estévez]
07-10-2005, 10:19:02
...Al utilizar la función FreeLibrary se debe primero hacer el cargue de la dll para obtener su identificador (por decirlo asi) con la función LoadLibrary('dllhost.exe')
Más que "cargar" la librería (con LoadLibrary, que la carga en memoria) debes obtener su identificador, como ya te han dicho.
Si dec me permite una pequeña modificación:


var
hDLL: THandle;
begin
...
// acceder al handle de la librería
hDLL := GetModuleHandle(aName);
// la ha encontrado?
if (hDLL <> 0) then
FreeLibrary(GetModuleHandle(PChar(FileName)));
...


Simplemente para no hacer el GetModuleHandle dos veces.

dec
07-10-2005, 12:06:02
Hola,



Si dec me permite una pequeña modificación:


var
hDLL: THandle;
begin
{...}
// acceder al handle de la librería
hDLL := GetModuleHandle(aName);
// la ha encontrado?
if (hDLL <> 0) then
FreeLibrary(GetModuleHandle(PChar(FileName)));
{...}


Yo te permito lo que tú quieras Neftali, ahora bien, ¿cuántos "GetModuleHandle" ves tú en el código de más arriba? :D

Neftali [Germán.Estévez]
07-10-2005, 12:20:23
...Si es que no tengo dedos, tengo MORCILASSSSS!!!!!!!!!!!!
TORPE es poco.....


var
hDLL: THandle;
begin
...
// acceder al handle de la librería
hDLL := GetModuleHandle(aName);
// la ha encontrado?
if (hDLL <> 0) then
FreeLibrary(hDLL);
...

...
veo 1 (ahora). :D:D:D