Salut csweety13,
voici les sources d'un composant que j'ai réaliser afin d'interdire l'execution de mon application plusieurs fois.
unit RunOnce;
interface
uses Windows, SysUtils, Classes, Forms, Dialogs;
type
TRunOnce = class(TComponent)
private
FApplicationName : string;
procedure IsExist;
public
constructor Create(Aowner : TComponent); override;
published
property ApplicationName : string read FApplicationName write FApplicationName;
end;
procedure Register;
implementation
constructor TRunOnce.Create(Aowner : TComponent);
begin
inherited Create(Aowner);
if not (csDesigning in ComponentState) then
begin
if ApplicationName = '' then
ApplicationName := ExtractFileName(Application.ExeName);
IsExist;
end;
end;
procedure TRunOnce.IsExist;
var
FHandle : THandle;
Hndl : THandle;
FFileView : Pointer;
begin
// Test si l'application n'a pas déjà été exécuté.
try
FHandle := CreateFileMapping( $FFFFFFFF, nil, PAGE_READWRITE, 0, 4, PChar(ApplicationName));
if FHandle = 0 then
abort;
FFileView := MapViewOfFile( FHandle, FILE_MAP_WRITE, 0, 0, 4 );
if FFileView = nil then
abort;
Hndl := PHandle(FFileView)^;
if Hndl <> 0 then
begin
if IsIconic(Hndl) then
begin
ShowWindow(Hndl, SW_RESTORE);
end;
SetForegroundWindow(Hndl);
Halt(0);
end
else
integer(FFileView^) := Application.Handle;
except
end;
end;
procedure Register;
begin
{Register standard components}
RegisterComponents('Exemples',[TRunOnce]);
end;
end.
Le principe est d'écrire le nom de ton application dans une zone mémoire et lors de la deuxième execution, comme il trouve déjà le nom écrit dans cette zone, il interdit l'execution de l'application.
Bonne Prog, ;)
Olivier
PS : Lorsqu'une réponse vous convient, n'oubliez pas de la valider.