Tester l'exécution d'une appli

Résolu
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008 - 8 nov. 2004 à 12:09
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006 - 9 nov. 2004 à 10:24
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

Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
8 nov. 2004 à 12:35
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.
3
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
8 nov. 2004 à 12:51
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
3
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
8 nov. 2004 à 19:49
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 ! ;)

-------------------------------------------
3
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
8 nov. 2004 à 14:00
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
8 nov. 2004 à 17:00
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
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
8 nov. 2004 à 19:49
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 ! ;)

-------------------------------------------
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
8 nov. 2004 à 21:17
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
0
csweety13 Messages postés 20 Date d'inscription vendredi 7 mars 2003 Statut Membre Dernière intervention 6 août 2008
9 nov. 2004 à 09:54
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
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
9 nov. 2004 à 10:05
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 ! ;)

-------------------------------------------
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
9 nov. 2004 à 10:24
Je me disais :).
j!nH
0
Rejoignez-nous