Buenas lucianojdg:
Yo hago una cosa media extraña que me pasaron hace algún tiempo. A pesar de eso me sigue funcionando perfectamente. Pruebalo...
Tienes que ponerlo en el OnCreate de tu Form Principal.
Código:
procedure TMainForm.FormCreate(Sender: TObject);
var Sem : THandle;
begin
Sem := CreateSemaphore(nil,0,1,'PROGRAM_NAME');
if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
begin
CloseHandle( Sem );
ShowMessage('This program is already running.'+
'Este programa ya se está ejecutando...');
Halt;
end;
end;