Como solución primaria, utilizaría las herramientas del lenguaje:
Código:
If GlobalFindAtom( StrAtomo ) = 0 Then
begin
IdAtomo := GlobalAddAtom( PChar(StrAtomo) );
try
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
GlobalDeleteAtom(IdAtomo); //Elimina el Atomo
end
end
else
ShowMessage('¡La Aplicación ya está corriendo!');
Pero si el usuario "Mata" el proceso, nunca se ejecutará el GlobalDeleteAtom, por lo que quedará en la lista global. Por eso prefiero usar "Semáforos" (CreateSemaphore) que son visibles desde todos los procesos y se eliminan cuando el proceso se elimina:
Código:
const
PApplicationId = 'Nombre del la Aplicación';
var
hSemaphore: THandle;
begin
hSemaphore := CreateSemaphore(nil, 0, 1, PApplicationId);
if (hSemaphore <> 0) and (GetLastError=ERROR_ALREADY_EXISTS) Then
ShowMessage('¡La Aplicación ya está corriendo!')
else
try
ShowMessage('Application.Run');
finally
CloseHandle(hSemaphore);
end;
end.