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 :

savoir si outlook s'est fermé correctement


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut savoir si outlook s'est fermé correctement
    Bonjour, voilà mon appli fait une sauvegarde, et sauvegarde notamment les fichiers critiques d'outlook (les .pst) qui contiennent tous les messages.
    Comme beaucoup de monde dans la boîte laisse outlook ouvert en permanence (moi le premier), le temps de la sauvegarde je ferme outlook puis je le réouvre après.

    ça marche très bien, sauf dans le cas où l'utilisateur est en train d'écrire un message (ça lui demande si il veut enregistrer Oui/Non/Annuler).
    Si l'utilisateur n'est pas devant son pc où si il annule, outlook n'est pas fermé et le fichier .pst n'est pas sauvegardé. J'aimerai donc signaler l'incident "outlook ne s'est pas fermé".

    Voici mon code.
    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
     
    {
     Pour automatiser l'arret d'outlook il suffit de créer par programmation un objet DCOM de
     type TOutlookapplication (composant de l'onglet serveur) en lui mettant la propriété
     ConnectKind à ckRunningInstance. Lors de la connexion une exception sera déclenchée si
     outlook n'est pas démarré à défaut il faut lancer la méthode Quit de cet objet pour arrêter
     outlook. Pour le redémarrer après la sauvegarde, il faut suivre le même principe en mettant
     connectKind à ckNewInstance et Autoquit à false.
    }
            dcomoutlook := TOutlookApplication.Create(nil);
            try
              DCOMoutlook.ConnectKind := ckRunningInstance;
              //Si pas ouvert => exception, sinon affectation du booléen
              dcomoutlook.Quit;
    //***** je veux savoir ici si outlook est fermé *****
            except
            end;
    j'ai évidemment déclaré dans mes var :
    DCOMoutlook: TOutlookApplication;

    Quelqu'un a une idée ?
    Membre éclairé, lol !

  2. #2
    Membre confirmé Avatar de heid
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Mai 2002
    Messages : 388
    Points : 597
    Points
    597
    Par défaut
    une idée comme ca :liste les process et cherche outlook.

  3. #3
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    j'ai cherché un peu, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              if (FindWindow('OUTLOOK.EXE', nil) <> 0) then
                { ...outlook pas fermé }
    ne marche pas
    Membre éclairé, lol !

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut iubuto!

    Avec un membre du forum (Yank), nous avons mis au point un code pour détecter si un programme est déjà lancé!
    Ça marche vraiment bien, et l'avantage c'est que cette fonction se sert du nom du fichier!
    Tu pourras savoir si le programme est bien fermé ou encore en cours d'éxécution...

    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
    Function GetIsTask(ExeFileName: string):Boolean; 
    var ContinueLoop: BOOL; 
        FSnapshotHandle: THandle; 
        FProcessEntry32: TProcessEntry32; 
     
    Begin 
     Result := false; 
     FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
     FProcessEntry32.dwSize := Sizeof(FProcessEntry32); 
     ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
     While integer(ContinueLoop) <> 0 do 
      Begin 
       if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  UpperCase(ExeFileName))or 
       (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) 
        then Result := true; 
       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
      End; 
     CloseHandle(FSnapshotHandle); 
    End;
    à+
    De retour parmis vous après 10 ans!!

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Si je dis pas de conneries, ton programme est censé quitter Outlook s'il est ouvert. Tu peux attendre la fin du programme en utilisant la fonction de l'API Windows WaitForObject avec un timeout. Tu boucles et en fonction du temps que ca prend tu décides quoi faire.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    D'ailleurs, pourquoi ne pas utiliser
    quitter : SendMessage
    lancer : ShellExecute
    : Ca semble plus robuste qu'utiliser COM

  7. #7
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    bein c le collègue ingénieur qui m'a dit d'utiliser DCOM, peut-être que ça quitte plus proprement qu'un kill de brute, demain j'essayerai la fonction.
    Membre éclairé, lol !

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Avec send message tu peux demander à ton appli de quitter. C'est là même chose que de cliquer sur la croix en haut à droite.
    C'est WM_QUIT.

    Faut juste récupérer le handle de l'exe et ça tu peux le faire avec le code de Sub0

  9. #9
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Justement, ce code est à l'origine d'une fonction permettant de fermer un programme grâce au nom du fichier...

    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
    Kill a running task. 
    2/13/2001 12:12:58 PM by Administrator 
    Kill a running task. 
     
     
     
    uses 
    Tlhelp32; 
    ... 
    function KillTask(ExeFileName: string): integer; 
    const 
    PROCESS_TERMINATE=$0001; 
    var 
    ContinueLoop: BOOL; 
    FSnapshotHandle: THandle; 
    FProcessEntry32: TProcessEntry32; 
    begin 
    result := 0; 
     
    FSnapshotHandle := CreateToolhelp32Snapshot 
    (TH32CS_SNAPPROCESS, 0); 
    FProcessEntry32.dwSize := Sizeof(FProcessEntry32); 
    ContinueLoop := Process32First(FSnapshotHandle, 
    FProcessEntry32); 
     
    while integer(ContinueLoop) <> 0 do 
    begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
    UpperCase(ExeFileName)) 
    or (UpperCase(FProcessEntry32.szExeFile) = 
    UpperCase(ExeFileName))) then 
    Result := Integer(TerminateProcess(OpenProcess( 
    PROCESS_TERMINATE, BOOL(0), 
    FProcessEntry32.th32ProcessID), 0)); 
    ContinueLoop := Process32Next(FSnapshotHandle, 
    FProcessEntry32); 
    end; 
     
    CloseHandle(FSnapshotHandle); 
    end; 
     
     
     
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    KillTask('notepad.exe'); 
    end;
    à+
    De retour parmis vous après 10 ans!!

  10. #10
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Salut !

    le collègue ingénieur m'a pondu ou trouvé un code qui marche super pour outlook, alors bon je vais mettre le sien, merci quand même de m'avoir aidé.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, OleServer, Outlook2000, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      DCOMoutlook: TOutlookApplication;
      bOuvert, bFermeSuccess : Boolean;
    begin
      //
      // Test si outlook est ouvert et si c'est le cas essaye de le fermer
      //
      bOuvert:= False;
      DCOMoutlook := TOutlookApplication.Create(nil);
      try
        DCOMoutlook.ConnectKind := ckRunningInstance;
        //Si pas ouvert => exception, sinon affectation du booléen
        Try
          DCOMoutlook.Connect;
          bOuvert := True;
          DCOMoutlook.Quit;
        Except
          // Erreur connection => Outlook non ouvert
        End;
      Finally
        DComOutlook.Free;
      end;
     
      //
      // Test si outlook est fermé
      //
      bFermeSuccess := True;
      if ( bOuvert ) Then
      Begin
        DCOMoutlook := TOutlookApplication.Create(nil);
        try
          DCOMoutlook.ConnectKind := ckRunningInstance;
          //Si pas ouvert => exception, sinon affectation du booléen
          Try
            DCOMoutlook.Connect;
            bFermeSuccess := False;
          Except
            // Erreur connection => Outlook est bien fermé
          End;
        Finally
          DComOutlook.Free;
        end;
      End;
     
     
      if ( bOuvert ) Then
      Begin
        ShowMessage('Outlook ouvert');
        if ( bFermeSuccess ) Then ShowMessage('Outlook fermé avec succés')
        Else ShowMessage('Outlook non fermé');
      End
      Else ShowMessage('Outlook non démarré');
     
    end;
     
    end.
    Membre éclairé, lol !

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

Discussions similaires

  1. [OL-2010] Nombre de comptes Outlook n'est pas correct?
    Par Djema_mdi dans le forum Outlook
    Réponses: 0
    Dernier message: 15/01/2015, 18h56
  2. [XL-2002] Savoir comment un classeur est fermé
    Par Sergio63 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/04/2009, 17h39
  3. Réponses: 2
    Dernier message: 01/12/2008, 14h17
  4. comment savoir si une application est fermée ?
    Par Flow_75 dans le forum C++Builder
    Réponses: 10
    Dernier message: 13/12/2006, 10h27
  5. Comment savoir si une fenêtre s'est fermée
    Par niuniuk36 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 12/05/2005, 14h49

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