Ver Mensaje Individual
  #1  
Antiguo 07-11-2007
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Reputación: 19
walito Va por buen camino
Problemas con GetProcAddress

Buenas tengo un problemilla que no se a que se debe.
Tengo la funcion que esta mas abajo que lo que hace es levantar una libreria BPL, hasta aca todo bien sin problemas, de esta libreria necesito llamar a una funcion que solo me retorna un STRING, hasta aca todo bien.

Resulta que cuando hago menuName := FuncGetMainMenu; y despues hago un UnloadPackage(handle); explota con error de memoria, si no hago el UnLoad todo bien, pero si o si necesito liberar esa memoria, que puede ser?

Hay que liberar memoria de aca FuncGetMainMenu ?

yo mas que nada necesito poder llamarlo varias veces asi, por eso hice esa funcion, pero explota al liberar.

modulos.getSubMenu('mimodulo1.bpl', string1 );
modulos.getSubMenu('mimodulo2.bpl', string2 );
modulos.getSubMenu('mimodulo3.bpl', string3 );


Gracias

Dejo algo del codigo aca:
Código Delphi [-]
type
  TGetMainMenu = function: string;

Codigo de la funcion:
Código Delphi [-]
function TModules.getMainMenu(moduleName: string; var menuName: string): Integer;
var
  FuncGetMainManu: TGetMainMenu;
begin
    menuName := '';

    {* verifico que el modulo existe, junto con el archivo *}
    if FileExists(ExtractFilePath(ParamStr(0))+moduleName) then
    begin
        {* Cargo el modulo a memoria *}
        handle := LoadPackage(ExtractFilePath(ParamStr(0))+moduleName);

        {* si es un modulo válido *}
        if handle <> 0 then
        begin
            try
               {* llamo el modulo *}
               @FuncGetMainManu := GetProcAddress(handle,'getMenu');

               if Assigned(FuncGetMainManu) then
               begin
                    {* extraigo el nombre del menu principal *}
                    menuName := FuncGetMainManu;

                    if menuName <> '' then
                        Result := 0
                    else
                        Result := -1;
                end
                else
                    Result := -2;
            finally
                {* libero memoria *}
                UnloadPackage(handle);
            end;
        end
        else
            Result := -3;
    end
    else
        Result := -4;
end;

Última edición por walito fecha: 07-11-2007 a las 21:17:17.
Responder Con Cita