Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2007
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 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
  #2  
Antiguo 07-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Advierto de que muy probablemente esté equivocado, pero, ¿no tendrá algo que ver con el uso de "string" como resultado de la función? Tal vez debería usarse "PChar", o, en su defecto, hacer caso al "aviso" que aparece cuando inicias un nuevo proyecto de DLL en Delphi:

Código Delphi [-]
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

Ya digo que tengo la impresión de que el problema no va por ahí, pero,... no sé...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 08-11-2007
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
walito Va por buen camino
DEC!! sos groso. Sabes que nunca le di pelota a ese cartel, y tenias razon, en la libreria BPL cambie a que la funcion exportada retornara un PChar y andubo todo bien.


EDITADO
--------

Te comento que dentro de la funcion que tenia problemas se solucionaron, te muestro la funcion:

Código Delphi [-]
function TModules.getMainMenu(moduleName: string): PChar;
var
  FuncGetMainManu: TGetMainMenu;
  menuName: PChar;
begin
    menuName := nil;

    {* 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 *}
                    Result := FuncGetMainManu;
                end
                else
                    Result := menuName;
            finally
                {* libero memoria *}
                UnloadPackage(handle);
            end;
        end
        else
            Result := menuName;
    end
    else
        Result := menuName;
end;

esta es mi funcion de la bpl
Código Delphi [-]
function getMenu: PChar;
begin
    Result := PChar('test');
end;

exports
getMenu;


Pero ahora cuando intento usar el PChar que me retorno la funcion me da error de memoria, y ya no se ni como castearlo, probe de barias formas y nada, tambien lo depure linea por linea y la funcion me retorna bien al parecer, pero la variable a la que le asigne dicho retorno no la puedo inspeccionar y si hago un showmeesage o messagebox da error de memoria.

Alguna sugerencia?

Gracias Dec.

Última edición por walito fecha: 08-11-2007 a las 14:25:14.
Responder Con Cita
  #4  
Antiguo 08-11-2007
Avatar de walito
walito walito is offline
Miembro
 
Registrado: jun 2005
Posts: 121
Poder: 19
walito Va por buen camino
Encontre cual es el problema, si hago esto:

Código Delphi [-]
UnloadPackage(handle);

pero tengo que hacerlo! como puedo zafar de ese problema?

todo bien, pero el PChar se borra de memoria cuando el UnLoadPackage, y esta bien es asi, jaja.

Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 06:20:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi