Communication entre deux instances d'un même programme

5/5 (13 avis)

Vue 10 208 fois - Téléchargée 814 fois

Description

Voilà, le problème que je me suis posé lors du concours de VBfrance:

1er) Je l'ance une application (par un click droit dans l'exploreur windows) avec une chaine de commande qui correspond à un fichier image par exemple...

2eme) Je lance une nouvelle fois l'application avec un autre raccourici et je voudrais que la commande passe dans la premier application déja ouverte.. et surtour que l'apllication ne se lance pas deux fois...

ET Bien j'ai enfin trouvé la solution !!! Donc c'est valable pour autre chose que des images biensur... J'ai essayé de le rendre le plus souple possible d'utilisation... en clair il faudra rajoutter à votre aplli 1 module.bas une classe et trois ligne dans le démarage de votre prog...


OUI POUR TESTER LE FONCTIONNEMENT JE VOUS AI MIS LE PROG INSTANCE.EXE ... lancer le deux fois :) ...
Pour les inquiet de nature ... compilé le source et lancer votre compil

Vous aurez compris ... CA NE MARCHE PAS EN DEV MODE !

Mise A jour le 24/03/2003: LE PLANTAGE SOUS W98 EST RESOLU !!!
Le problème venait du détachement du callback qui ne se fesait pas. Il semble que sous W98 le programme ne passe pas par la fonction de la classe
Class_Terminate ...

Source / Exemple :


'Seulement ça dans votre form_load
Méthode 1:

  'Déclaration de la classe
    Set My_Instance = New InstanceClass
  'Initialisation de la classe (Création du TextBox de reception)
    My_Instance.InitClass Me.hwnd
  'Renseigne le texte à faire passer au textbox de l'autre instance
    My_Instance.CommandLine = "Message envoyer par la deuxième instance !!! "
  'Définition de l'action a réalier
  'Ici on anvoie le texte à l'instance déja en mémoire et on arrête le prog
    My_Instance.ActionCmd = Send_Killme
  'Vas teste :) :) :)
    My_Instance.PrevInstace

Méthode 2:

  'Déclaration de la classe
    Set My_Instance = New InstanceClass
  'Initialisation de la classe (Création du TextBox de reception)
    My_Instance.InitClass Me.hwnd
  'Définition de l'action a réalier juste le test
    My_Instance.ActionCmd = None
  'Vas teste :) :) :)
    If My_Instance.PrevInstace = True Then
        My_Instance.SendTexte "Message envoyer par la deuxième instance !!! "
        My_Instance.SowPrev
        My_Instance.Class_Terminate98
        End
    Else
        'Ici on continu le prog
    End If

Codes Sources

A voir également

Ajouter un commentaire Commentaires
DarthPredateur Messages postés 30 Date d'inscription vendredi 17 janvier 2003 Statut Membre Dernière intervention 25 mars 2003
22 mars 2003 à 09:22
trop cool encore bravo pour tes supers sources
Bricomix Messages postés 340 Date d'inscription vendredi 11 octobre 2002 Statut Membre Dernière intervention 14 février 2005
22 mars 2003 à 11:55
Merci pour cette source ! Je m'étais déjà posé la question, sans y réfléchir d'avantage. Et toi, tu l'as fait !! 10/10
logisim Messages postés 49 Date d'inscription mardi 8 mai 2001 Statut Membre Dernière intervention 14 août 2004
23 mars 2003 à 16:21
Super, mais lorsqu'on lance la deuxième instance ça plante, même si la ligne de commande est bien passée. Je suis sous Win98, une solution ?
fredlynx Messages postés 662 Date d'inscription mercredi 16 janvier 2002 Statut Modérateur Dernière intervention 16 octobre 2010 1
23 mars 2003 à 16:55
C a dire ça plante ?? Je n'ai pas testé sous 98 :( mais je ne vois pas trop ce qui peut géner... Essaye de faire comme ça dans l'exemple et recompile..

Private Sub Form_Load()
Label2.Caption = "Cette application est la première instance du programme lancé... " & vbCrLf & _
"Si vous relancer une autre fois l'application alors...." & vbCrLf & vbCrLf & _
"Vous recevrez un message de la deuxièmme instance dans le text box ci-dessus"
'Déclaration de la classe
Set My_Instance = New InstanceClass
'Initialisation de la classe
My_Instance.InitClass Me.hwnd
'Renseigne le texte à faire passer au textbox de l'autre instance
My_Instance.CommandLine = "Message envoyer par la deuxième instance !!! "
'Définition de l'action a réalier
'Ici on anvoie le texte à l'instance déja en mémoire et on arrête le prog
My_Instance.ActionCmd = None
'Vas teste :) :) :)
If My_Instance.PrevInstace = True Then
My_Instance.SendTexte
End
End If
End Sub
suoe Messages postés 10 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 13 mars 2004
24 mars 2003 à 14:33
salut pas mal ton programme mais il plante sous win98.Kess ki plante voila le message à toi de déchiffrer ;-) lol :

INSTANCE a causé une défaillance de page dans
le module à 0000:00000000.
Registres :
EAX=00000000 CS=018f EIP=00000000 EFLGS=00010246
EBX=00000002 SS=0197 ESP=0063fa60 EBP=0063fad4
ECX=004034c5 DS=0197 ESI=00000000 FS=4ce7
EDX=816a3ec8 ES=0197 EDI=0063fadc GS=0000
Octets à CS : EIP :
01 00 00 00 65 04 70 00 16 00 cd 09 65 04 70 00
État de la pile :
004034c5 00000880 00000002 00000000 00000000 0063fadc 00008b4c 0063fb28 0107ccb4 0000085c 0063fae4 00000000 00000000 0000085c 00000002 00000000

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.