Ce code est logiquement placé dans le source du projet afin qu'il soit exécuté avant même la création de la Form. Mais il pourrait être placé dans le FormCreate.
program Project1;
uses
SysUtils,Windows,Dialogs,Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const NbreProcess : Integer = 3; //Nbre maxi de processus autorisés.
SEMAPHORE_ALL_ACCESS = EVENT_ALL_ACCESS;
var HdleSem : THandle; //Handle du Sémaphore.
Count : Integer; //Nbre d'accès au Sémaphore dejà utilisés.
begin
HdleSem := OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,'NomSem');//On essaie d'ouvrir le sémaphore.
if HdleSem=0 then begin //Si pas encore créé, c'est donc la 1ère instance et..
HdleSem := CreateSemaphore(nil,0,NbreProcess,'NomSem'); //..on le crée.
if HdleSem = 0 then begin //Si échec de la création..
ShowMessage('Erreur d''ouverture du sémaphore !') ;
Halt; //..on quitte.
end ;
end;
if not(releaseSemaphore(HdleSem,1,@count)) then begin //Si l'ajout d'un nouvel accès au Sémaphore échoue..
ShowMessage('Pas plus de ' + IntToStr(NbreProcess) + ' processus !'); //.. c'est que le nombre maxi est atteint et..
Halt; //..on quitte..
end ;
Application.Initialize; //..sinon la limitation n'est pas atteinte et on continue.
Application.CreateForm(TForm1, Form1);
Application.Run;
{Fonction d'attente qui décrémente le compteur du Sémaphore quand on supprime un des process.}
WaitForSingleObject(HdleSem,0) ;
END.