Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manejando manejadores... (https://www.clubdelphi.com/foros/showthread.php?t=40989)

Berto2003 05-03-2007 14:27:38

Manejando manejadores...
 
Hola de nuevo amigos/as del foro:

Aquí toi con otra dudilla-problema que me ha surgido :D . Os agradecería si podeis que me echárais una mano. El tema es que hemos creado una aplicación en Delphi 7 y que necesitamos llamarla desde un programa desarrollado en Delphi 5.
Hasta aquí todo bien, ya que utilizamos llamadas a librerías DLL y funciona bien. Lo único y ahí está el problema, es que cada vez que llamo a una ventana del nuevo programa de Delphi 7 aparece como un nuevo botón en la barra de tareas con su correspondiente icono y claro, cuantas más se abran más botones aparecen :confused: . Creo que tiene que ver algo con manejador de la aplicación (handle) que le pasamos para hacer la llamada, no? Pero no sé si es posible solucionarlo para que no aparezcan esos sucesivos botones. Algo hago parecido a esto:

Código Delphi [-]
procedure PROCEDIMIENTOLLAMADA(var ..); stdcall;
var
   Biblioteca: THANDLE;
   Procedim: TProcD7;
begin
  try
     Biblioteca := LoadLibrary('C:\...\MILIBRERIA.DLL');
  finally
       if (Biblioteca >= HINSTANCE_ERROR) then
       begin
             try
               @Procedim:=GetProcAddress(Biblioteca,'NOMBREPROGRAMA');
               if (@Procedim <> nil) then
                 Procedim(application.handle);   // Esto es correcto???

             finally
                  FreeLibrary(Biblioteca);
             end;
       end
       else
           Application.MessageBox('Error', 'Aviso', MB_ICONERROR+MB_OK);
    end;
end;    // de procedim.


Bueno, espero haberme explicado bien.

Gracias por todo,
Saludos y un abrazo,

Berto2003.

basti 05-03-2007 15:19:36

Sí, el problema está en Application.Handle. No muestras el código de Procedim, pero debería ser algo así:

Código Delphi [-]
procedure Procedim(Hnd : THandle); stdcall;
begin
   Application.Handle := Hnd;
  // a partir de aquí el resto...
end;

basti 05-03-2007 15:23:05

Acabo de fijarme que PROCEDIMIENTOLLAMADA es stdcall, ¿está también en una dll?. Si es así, tendrías que hacer lo mismo con PROCEDIMIENTOLLAMADA, que reciba el Handle de la aplicación principal.

Berto2003 05-03-2007 18:18:32

Hola basti!!

El procedimiento está definido de la siguiente manera, en la misma unidad donde está implementado PROCEDIMIENTOLLAMADA:

type
TProcD7 = procedure (handle: THandle); stdcall;

Y sí, PROCEDIMIENTOLLAMADA está en una dll....

Gracias por la ayuda.
Saludos,

basti 05-03-2007 22:57:07

Por defecto, el objeto Application de una dll toma el valor 0 para el Handle.

PROCEDIMIENTOLLAMADA, parece que recibe el handle de la aplicación, es eso correcto?. Si es así sólo tienes que asignarlo al objeto Application de la dll.

Código Delphi [-]
procedure PROCEDIMIENTOLLAMADA ( handle : THandle); stdcall;
begin
  Application.Handle := handle;
.
.
.
end;

Si el handle que recibe PROCEDIMIENTOLLAMADA, no tiene que ver con el handle de la aplicación, tendras que buscarlo con FindWindow (busca FindWindow en el foro y encontrarás varios ejemplos).

Berto2003 06-03-2007 10:38:40

Gracias basti!!

Problema solucionado, oe, oe...!! :D Me faltaba eso que me comentas. Muchas gracias por la ayuda.


Un cordial saludo, :)
Berto2003.


La franja horaria es GMT +2. Ahora son las 01:17:13.

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