Ver Mensaje Individual
  #7  
Antiguo 28-07-2011
ivantj24 ivantj24 is offline
Miembro
NULL
 
Registrado: feb 2011
Posts: 110
Reputación: 14
ivantj24 Va por buen camino
problema con las multiples sesiones de la unidad de Roman :(

Espero no estar violando las reglas del foro, mejor decidi hacer el post en un nuevo hilo, ya que lo hice en otro que fue resuelto por otro tema aparte, Ya que mire la unit de Roman y seguro que el problema es mio por que no he visto que alguien se queje de la unidad que Roman nos proporciono a todos muy amablemente, espero si alguien me puede ayudar ya que no pude echar a andar esto de evitar multiples instancias, expongo mi problema

este es el codido, haciendo los pequenios cambios como dice en la pagina que solo fueron aniadir 2 lineas

Cita:
[FONT=verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif]unit UIApp;

interface

implementation

uses
Windows, SysUtils, Forms;

const
{ Cadenas para registrar el mutex y el mensaje }
sMutex = 'F55F3FEC-94CC-4A02-8B31-5BF0EBE9E9EA';
sActivar = 'D8A807D2-D4DC-4102-B431-9CCD3636FFAB';

var
mActivar : Cardinal; { Mensaje para activar la instancia anterior }
Mutex : Cardinal; { Mutex }
PrevWndProc : TFarProc; { Procedimiento de ventana original }


function AppWndProc(Handle: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LongInt; stdcall;
var
FgThreadId : DWORD; { Hilo de la app. que tenga el foco }
AppThreadId : DWORD; { Hilo de nuestra aplicación }

begin
if Msg = mActivar then
begin
//Esta parte la pongo como dice en la pagina, y todo bien pero no me evita //las multiples instancias

if not IsWindowVisible(Handle) then
ShowWindow(Handle, SW_SHOW);

{ Si está minimizada basta restaurarla }
if IsIconic(Handle) then
ShowWindow(Handle, SW_RESTORE)
else
begin
{ Obtener los hilos }
FgThreadId := GetWindowThreadProcessId(GetForegroundWindow, nil);
AppThreadId := GetWindowThreadProcessId(Handle, nil);

{ Anexar el hilo de nuestra app. al de la que tenga el foco }
AttachThreadInput(AppThreadId, FgThreadId, true);

{ Ahora sí, activar la applicación }
SetForegroundWindow(Handle);

{ Separar el hilo de nuestra app de la otra }
AttachThreadInput(AppThreadId, FgThreadId, false);
end;

Result := 0;
end
else
{ Dejar que el procedimiento original se encargue de los otros mensajes }
Result := CallWindowProc(PrevWndProc, Handle, Msg, wParam, lParam);
end;

procedure Activar;
begin
{ Mandamos el mensaje a todas las ventanas }
SendMessage(HWND_BROADCAST, mActivar, 0, 0);
end;

procedure Registrar;
begin

//En la Pagina de Roman dice que cambiemoso esta parte por algo algo asi
//mActivar := RegisterWindowMessage(PChar(sActivar + //Application.ExeName));
//Mutex := CreateMutex(nil, true, PChar(sMutex + Application.ExeName));

//pero mi problema viene siento que si hago esto me abre las sesiones de //todos modos
}
mActivar := RegisterWindowMessage(sActivar);
Mutex := CreateMutex(nil, true, sMutex);

{ Si ya existe el mutex lanzamos una excepción silenciosa }
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Mutex := 0;
abort;
end
else
begin
{ Sustituimos el procedimiento de ventana }
PrevWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
SetWindowLong(Application.Handle, GWL_WNDPROC, LongWord(@AppWndProc));
end;
end;

initialization
try
Registrar;
except
Activar;
Halt;
end;

finalization
if Mutex <> 0 then ReleaseMutex(Mutex);
end.
[/font]
[FONT=verdana,geneva,lucida,'lucida grande',arial,helvetica,sans-serif]lo que me ocurre, es que al ejecutar el exe, me abre normal el programa, pero si intento ejecutar de nuevo mi aplicacion no la abre, eso esta muy bien, el problema es que checo en el Administrador de tareas y me abre 2 procesos de mi programa, uno que es el correcto es el numero uno, y el segundo que no lo abre el programa por que ya esta abierto uno, pero el proceso esta activo y al momento de cerrar mi programa, lo cierro y su proceso tambien se cierra pero el segundo proceso de la instancia del programa que no se abrio, no se cierra, quedandose en memoria y evitando que futuras aplicaciones de mi programa se abran, espero que alguien me pueda ayudar, en la pagina de Roman menciona que hay que cambiar los valores de las constantes, se las cambio pero aun asi me sigue pasando ese error.

Aunque no se abra un segundo programa, ( una ventana ), en el administrador de procesos se ve que si esta abierto, y al cerrar el programa, la primer instancia, las otras instancias o veces que intente abrir el programa para verificar que no se abrieran, siguen activas y por ende despues ya no puedo abrir para nada mi aplicacion aunque ya no este 'abierta' por que el proceso esta activo, solo hasta cuando cierro esos procesos puedo abrir de nuevo mi programa, espero alguien me pueda ayudar si no es mucha molestia, por que si me interesa evitar multiples instancias de mi programa. no se si tenga que ver por que mi programa usa MDI y al cerrar el programa pongo este codigo

[/font]
Cita:
[FONT=verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif]Action:= caFree;
form1:= Nil;
[/font]
[FONT=verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif]no se si tenga algo que ver las MDI o me falta cerrar de alguna otra forma, espero me puedan ayudar, el codigo de Roman no lo he tocado, mas que en las lineas comentadas que menciono, saludos

y agrego en el drp asi:
[/font]


Cita:
[FONT=verdana,geneva,lucida,'lucida grande',arial,helvetica,sans-serif]uses
Forms,
UPrincipal in 'UPrincipal.pas' {frmPrincipal},
UUsuario in 'UUsuario.pas' {frmUsuario},
UDM in 'UDM.pas' {DM1: TDataModule},
UServicioCategoria in 'UServicioCategoria.pas' {frmServicioCategoria},
UInicioSesion in 'UInicioSesion.pas' {frmInicioSesion},
UTicket in 'UTicket.pas' {frmTicket},
SysUtils,
//aqui agrego la Unidad
UIApp in 'UIApp.pas';
[/font]
Estaba leyendo en otro hilo exactamente lo mismo pero la persona que menciono el problema ya no dijo nada mas, espero alguien me peuda ayudar, uso el Delphi 2007 en windows 7, no se si tenga algo que ver tambien eso, o si alguien tiene la unidad configurada :S podria proporcionarla, por que esta parte la quiero implementar para todas mis aplicaciones, gracias de antemano por la ayuda.
Responder Con Cita