none
Eviter le lancement de plusieurs instances de mon application RRS feed

  • Question

  • Bonjour,

    Lorsque je travaillais en ACC97, j'avais trouvé ceci : http://homepage.bluewin.ch/wstucki//Admin.htm#Eviter
    qui fonctionnait bien afin d'éviter le lancement de plusieurs instances de mon application.

    Voici la 1ère partie du code :

    Function EstExécutée() As Integer
    ' Objectif: déterminer si l'application a déjà été lancée par l'usager. Si c'est le cas.
    '      empêcher son chargement. Appelle la fonction TestDDELink.
    ' Cette fonction sera appelée depuis une macro AutoExec utilisant l'action ExécuterCode.
    Dim Bdd As Database
    Set Bdd = CurrentDb()
    If TestDDELink(Bdd.Name) Then
      EstExécutée = -1
    Else
      EstExécutée = 0
    End If
    End Function

     et la 2ème :

    Function TestDDELink(ByVal strNomApplication$) As Integer
    ' Argument: nom de l'application que l'usager veut lancer qui a été établi par la
    ' fonction EstExécutée
    Dim varCanalDDE As Long ' Pour stocker le numéro du canal de communication
                 ' entre 2 instances d'application
    On Error Resume Next
    Application.SetOption ("Ignore DDE Requests"), True
    ' Tentative d'ouverture d'un canal de communication entre 2 instances de
    ' l'application
    varCanalDDE = DDEInitiate("MSAccess", strNomApplication)
    ' Si l'application n'est pas déjà chargée, on obtient une erreur
    If Err Then
      TestDDELink = False
    Else
      TestDDELink = True
      DDETerminate varCanalDDE ' ferme le canal spécifié par le numéro contenu
                              'dans varCanalDDE
      DDETerminateAll          ' ferme tous les canaux ouverts
    End If
    Application.SetOption ("Ignore DDE Requests"), False
    End Function

    Sur ACC2010 le code plante sur : varCanalDDE = DDEInitiate("MSAccess",atrNomApplication) et Le message d'erreur est le suivant : "Erreur 282 ...impossible d'ouvrir le canal DDE

    Qui a t-il de changé sur ACCESS 2010 pour que cela ne fonctionne plus ?

    D'avance merci pour vos réponses


     

     

    mardi 5 avril 2011 13:54

Réponses

  • Bonjour,

    Ce mode d'utilisation de communication entre applications est révolu.

    Dans votre cas, le mieux est d'écrire une fonction qui lit tous les process actifs et qui vérifie la classe de chacun d'eux jusqu'à tomber sur celui d'Access, en l'occurence "OMain".

    Pour chaque process OMain en exécution, capturer le titre de la fenêtre et vérifier par rapport à celui qui est en cours d'exécution.
    Si l'égalité s'avère alors c'est qu'il existe déjà une instance. Invoquez alors la méthode Quit de l'objet Application après avoir averti l'utilisateur par un message idoine.

     


    Argy
    • Marqué comme réponse PinPon70 lundi 18 avril 2011 14:40
    lundi 11 avril 2011 13:35
    Modérateur

Toutes les réponses

  • Bonjour,

    Ce mode d'utilisation de communication entre applications est révolu.

    Dans votre cas, le mieux est d'écrire une fonction qui lit tous les process actifs et qui vérifie la classe de chacun d'eux jusqu'à tomber sur celui d'Access, en l'occurence "OMain".

    Pour chaque process OMain en exécution, capturer le titre de la fenêtre et vérifier par rapport à celui qui est en cours d'exécution.
    Si l'égalité s'avère alors c'est qu'il existe déjà une instance. Invoquez alors la méthode Quit de l'objet Application après avoir averti l'utilisateur par un message idoine.

     


    Argy
    • Marqué comme réponse PinPon70 lundi 18 avril 2011 14:40
    lundi 11 avril 2011 13:35
    Modérateur
  • Merci pour la réponse

    Je vais essayer

    lundi 18 avril 2011 14:40