Tester l'exécution d'une appli [Résolu]

Signaler
Messages postés
20
Date d'inscription
vendredi 7 mars 2003
Statut
Membre
Dernière intervention
6 août 2008
-
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
-
Bonjour,

je souhaite tester si mon exécutable est déjà lancé sur mon poste...
mais je ne souhaite pas tester grace à la procédure FindWindow qui teste uniquement le 'application.title'.

Je voudrais tester le nom de mon exécutable. (exemple toto.exe)!

Avez-vous une solution à m'apporter?

Merci d'avance,

CSweety13

10 réponses

Messages postés
309
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
24 septembre 2008
2
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.
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Tu as plus simple.

Tu peux setter le LastError à Null,créer un Mutex (CreateMutex), ensuite tu fais un GetLastError, si le mutex existe déjà tu quittes l'appli.

Olivier, tu libère quand ton fileMapping?

j!nH
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
hello,

il existe un composant UnPas2.pas (un pas deux) qui cree tout ça a votre place :)
je l'ai ici :


suffit de le poser sur la form, il a en plus deux evènement qui peuvent reagir qd on essaie de lancer une autre fois l'appli

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
Messages postés
309
Date d'inscription
jeudi 6 juin 2002
Statut
Membre
Dernière intervention
24 septembre 2008
2
Bonne Remarque Il est vrai que je ne libère jamais FileMapping.
Il suffirait déclarer FHandle : THandle en private et de libérer FileMapping dans le destroy --> CloseHanlde(FHandle);

J'ai trouver cette technique sur le net, ou ils expliquaient comme gérer le fait d'avoir qu'une seule instance de son application en mémoire.

Bonne Prog, ;)

Olivier

PS : Lorsqu'une réponse vous convient, n'oubliez pas de la valider.
Messages postés
20
Date d'inscription
vendredi 7 mars 2003
Statut
Membre
Dernière intervention
6 août 2008

Merci Loulibier pour tes idées, je vais creuser le problème et ta solution.

jinh68, je crois que ta solution est un peu trop sofistiquée pour un simple test d'exécution de programme, mais je vais tout de même voir ce que je peux en tirer.

Je vous remercie et vous tiens au courant de mes recherches.

CSweety13
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
hello,

il existe un composant TUnPasDeux.pas (un pas deux) qui cree tout ça a votre place :)
je l'ai ici :


suffit de le poser sur la form, il a en plus deux evènement qui peuvent reagir qd on essaie de lancer une autre fois l'appli

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Il ressemble beaucoup a celui dispo sur www.phidels.com (d'apres le nom je dis ça ^^).


program Project1;

uses
  Forms,
  windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
  SetLastError(NO_ERROR);
  CreateMutex (nil, False, 'MonMutexProject1');
  if GetLastError<>ERROR_ALREADY_EXISTS then
  begin
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
  end;

end.


Voila la soluce qui me semble bien plus simple que le FileMapping qui crée un espace mémoire....

j!nH
Messages postés
20
Date d'inscription
vendredi 7 mars 2003
Statut
Membre
Dernière intervention
6 août 2008

Bonjour,

je vous remercie tous pour votre aide, j'ai réussi à tester l'exécution de mon application grâce à la méthode de Loulibier.

Mais j'ai une question en suspens : est-ce qu'avec sa méthode il m'est possible de connaitre le 'application.title' de l'exécutable en cours?

Merci encore pour toute vos solutions.

CSweety13
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
euh c'est celui de phidels oui oui :) ce n'est pas le mien :D

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient ! ;)

-------------------------------------------
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Je me disais :).
j!nH