Hola Fernando.
Leyendo tu planteamiento y el artículo que enlazas, me parece que el problema reside en que el Explorador de Windows ejecuta rápida y simultáneamente una instancia de tu programa por cada archivo seleccionado (lo cual es razonable), pero de tal manera que la función FindWindow empleada para validar la existencia de otras instancias no encuentra la ventana de las demás instancias, puesto que apenas se está iniciando la aplicación de esas otras instancias.
Una solución podría ser el emplear un tipo de
semáforo más preciso, como un
mutex. Llamar a la función
CreateMutex al inicio del programa es un recurso muy socorrido en casos como este. Sin embargo, sin desatender el mecanismo de transferencia de parámetro que ilustra el artículo, adicionalmente tendrías que realizar un ciclo de espera para darle oportunidad a la primera instancia de crear la ventana a la cual se le envía el mensaje wm_CopyData.
Acorde a lo anterior, hice los siguientes cambios al código del ejemplo (no los he probado):
function CanStart: Boolean;
var
Wdw: HWND;
begin
CreateMutex (Nil, True, 'Enecumene.ProgramaTal');
// Si otra instancia ya creó el mutex
If GetLastError = Error_Already_Exists Then
Begin
Wdw := 0;
// Esperamos hasta que esa primera instancia cree el formulario principal
While Wdw = 0 Do
Wdw := FindDuplicateMainWdw;
// instance running: try to pass command line to it
// terminate this instance if this succeeds
// (routine explained later)
Result := not SwitchToPrevInst(Wdw);
End
Else
// no instance running: we can start our app
Result := True;
end;
begin
If CanStart Then
Begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
End;
// El mutex es cerrado / destruido automáticamente al finalizar la aplicación
end.
Espero te sirva. Seguimos en contacto.
Al González.