IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Une seule instance de l'appli et exécuter une procédure [FAQ]


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut Une seule instance de l'appli et exécuter une procédure
    Bonjour à tous,
    J'ai créer un programme qui peut être ouvert avec un paramètre. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Project1.exe mon_parametre
    J'ai créer une procédure qui analyse ce paramètre. Le problème est que j'aimerais n'avoir qu'une instance de mon application et que si une deuxième instance venait à s'ouvrir avec un paramètre, ma première instance récupère ses paramètres pour les renvoyer à ma procédure qui en fait l'analyse.

    J'ai déjà lu ce lien sur les instances et Delphi: http://delphi.developpez.com/faq/?page=interexecution , mais ça ne m'a pas donné de réponses à ma question.

    Voila, si quelqu'un a une idée sur le sujet.

  2. #2
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    As-tu réussi à n'ouvrir qu'une seule instance et maintenant tu veux faire analyser le paramètre par l'instance ouverte ou t'as besoin d'aide pour les deux?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    J'ai réussi à faire en sorte d'ouvrir qu'une seule instance de mon appli s'ouvre avec les Mutex tel que décrit sur le lien que j'ai mis dans mon premier message.

    Il ne me reste qu'à savoir comment faire passer le paramètre passé à ma deuxième instance pour l'envoyer à la première.

  4. #4
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    En VB on peut gérer ce genre de cas avec un Sub Main dans un module de code qu'on met en module principal. Mais j'ignore comment on peut faire ça en Delphi. Alors je passe la main.

    Je jette un oeil sur le lien que tu as mis. Ça m'intéresse.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    J'ai adapter le code du lien à mon programme mais j'ai encore certains problèmes...

  6. #6
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Explique lesquels. P't'êt' bien que les copains sauront d'où ça vient.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Finalement j'ai réussi!
    J'avais un petit problème de variable que j'ai réglé.

  8. #8
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    J'aimerais bien voir ton code. Le sujet m'intéresse.

    N'oublies pas de cliquer sur le bouton en bas à gauche.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Voici mon code du projet (ce qui se trouve dans le fichier dpr):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    program Project1;
     
    uses
      Windows, Forms, //ici on ajoute Windows...
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2},
      Unit3 in 'Unit3.pas' {Form3},
      Unit4 in 'Unit4.pas',
      Unit5 in 'Unit5.pas' {Form5};
     
    //Variables nécessaires
    var
      WM_ENVOI_ATOM, i:Integer;
      h:THandle;
      atom_Envoi:Atom;
      param_instance:String;
     
    {$R *.res}
     
    begin
      //Création du mutex
      SetLastError(NO_ERROR);
      CreateMutex (nil, False, 'Mon application');
      h := FindWindow(nil, 'Mon application');
      if GetLastError = ERROR_ALREADY_EXISTS then //si une instance existe déjà, on exécute cette condition
      begin
            WM_ENVOI_ATOM := RegisterWindowMessage('WM_ENVOI_ATOM');
            if ParamCount > 0 then
            begin
                    param_instance := '';
                    for i:=1 to ParamCount do
                    begin
                            param_instance := param_instance+' '+ParamStr(i); //je place tout les paramètres dans une variable
                    end;
                    atom_Envoi := GlobalAddAtom(PChar(param_instance));
                    SendMessage(h, WM_ENVOI_ATOM, atom_Envoi, 0); //On envoie le tout à la première instance
            end;
            Exit; //on quitte la deuxième instance
      end;
     
      Application.Initialize;
      Application.Title := 'Mon application';
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Application.CreateForm(TForm3, Form3);
      Application.CreateForm(TForm5, Form5);
      Application.Run;
    end.
    On déclare une procédure dans les déclarations publiques de mon unité principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public
        { Déclarations publiques }
        procedure DefaultHandler(var msg); override;
    On ajoute une variable dans l'unité contenant la form principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      Form1: TForm1;
      WM_ENVOI_ATOM : integer;
    Dans le FormCreate, on ajoute cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WM_ENVOI_ATOM := RegisterWindowMessage('WM_ENVOI_ATOM');
    On ajoute la procédure qui recevra les paramètres de la deuxième instance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.DefaultHandler(var msg);
    Var ParamRecu:PChar; atom_Recu:Atom;
    begin
            inherited DefaultHandler(Msg);
            if TMessage(msg).Msg = WM_ENVOI_ATOM then
            begin
                    atom_Recu := TMessage(msg).WParam;
                    GetMem(ParamRecu, 256);
                    GlobalGetAtomName(atom_Recu, ParamRecu, 256);
                    parse_parameters(ParamRecu); //j'envoie mes paramètres vers ma procédure qui les traite
                    GlobalDeleteAtom(atom_Recu);
                    FreeMem(ParamRecu);
            end;
    end;
    Voila à quoi ça ressemble. À noter que j'ai gardé les mutex pour la détection de plusieurs instances alors que le code de référence utilise une autre méthode.

  10. #10
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    C'est imprimé!

    merci bien. suis désolée de n'avoir pu t'aider plus si ce n'est qu'un vague soutien moral...

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 22
    Points : 29
    Points
    29
    Par défaut
    Salut,

    juste pour info, j'avais trouvé ça il y a un petit temps :
    http://www.delphidabbler.com/articles?article=13

    Il utilise une autre méthode que la tienne.
    Ca fonctionne très bien aussi.

  12. #12
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 381
    Points : 471
    Points
    471
    Par défaut
    Salut
    Chez nous on utilise ce petit composant en français qui marche bien.
    Il a les fonctionnalité que tu recherche :
    Une seul appli, déclenchement d'un évènement à l'ouverture d'une nouvelle instance et transmission des paramètres...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter une seule instance de votre application
    Par Montor dans le forum Contribuez
    Réponses: 0
    Dernier message: 01/01/2011, 20h04
  2. [FAQ] une seule instance de mon appli avec Mutex
    Par kacedda dans le forum MFC
    Réponses: 2
    Dernier message: 26/11/2008, 09h44
  3. [PB 5] Lancement une seule instance appli
    Par yafou2 dans le forum Powerbuilder
    Réponses: 5
    Dernier message: 08/12/2007, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo