App.PrevIntance ok mais ... et alors ? [VB] - Programmation
Marsh Posté le 08-04-2001 à 11:06:19
Le plus efficace est de passer par l'enregistrement d'une classe de fenêtre: en effet la classe de fenêtre est partagée par toutes les instances d'applications qui utilisent ce type de fenêtre. On peut alors communiquer entre application en utilisant une zone d'échange référencée par des données utilisateurs stockées dans la classe de fenêtre. Là il faut faire attention juste au nom de la classe de fenêtre qui doit être unique (le mieux est d'y inclure un GUID généré une bonne fois pour toute, avec MKGUID.EXE, et inscrit dans les sources de l'application). Seul problème: les accès concurrents à la ressources partagée: il faut généralement un mutex pour contrôler cet accès et il y a en plus des problèmes pour échanger des structures complexes, en plus du fait que les zones mémoires entres les instances multiples d'une application sont protégées... Sinon on peut toujours tenter d'énumérer les fenêtres qui utilisent cette classe, et leur envoyer des messages (mais il faut alors que l'application ait au moins une fenêtre utilisant cette classe unique, même si la fenêtre est cachée, c'est parfois un peu lourd, et en plus ça a toujours le défaut de synchroniser la réception et l'envoi de message, car l'expéditeur est bloqué pendant que son message est traité par l'application réceptrice)...
L'autre solution est d'utiliser une Mailbox (ça utilise les fonctions du réseau Netbios Microsoft, et ça marche sur toutes les versions de Windows), ou un Pipe nommé (mais ça ne marche pas sous Windows 95, uniquement depuis Windows 98 ou sous NT/2000). Le piège étant de créer un nom unique mais facilement repérable pour le pipe nommé ou la Mailbox (là aussi un GUID peut aider à rendre ce nom unique). L'intérêt de la Mailbox est qu'elle gère toute seule la file d'attente entre plusieurs applications qui communiquent avec elle (la gestion du Mutex associé est intégrée dans Windows), et que l'envoi n'a pas besoin d'être synchrone.
Marsh Posté le 08-04-2001 à 13:03:44
la premuère méthode m'interesse. T'aurais des exemple en Vb ou des adresses de site où je pourrais en trouver ?
Marsh Posté le 09-04-2001 à 00:50:05
Une petite technique pour communiquer avec la préinstance
Tu mets un text invisible dans ta form (TextedeCommunication)
Tu récupères TextedeCommunication.hwnd et le place dans la base de registre ou dans un ini au démarrage de l'appli.
Private Sub TextTransitoire_Change()
msgbox("jai eu un enfant" )
End sub
et pis quand tu démarres la second application tu récupères le hwnd de l'application (Lehwnd) dans la base de registre ou l'ini
et tu envois
SendMessage Lehwnd, &HC, 0, ByVal "Coucou maman"
dont voilà la déclaration à faire avant
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
récapitlatif:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Sub Form_Load()
If App.PrevInstance Then
SendMessage GetSetting(App.EXEName, "Hwnd", "TextedeCommunication" ), &HC, 0, ByVal "Coucou maman"
End
End If
SaveSetting App.EXEName, "Hwnd", "TextedeCommunication", TextedeCommunication.hwnd
End Sub
Private Sub TextedeCommunication_Change()
MsgBox ("jai eu un enfant" )
End Sub
si tu prends les précautions de rigueur ça doit rouler
Bonne chance pour ton prog
Marsh Posté le 06-04-2001 à 13:18:52
Ok ça marche bien pour savoir si l'application est déjà en mémoire. Je suppose qu'il passe par un Mutex...
Comment faire pour pouvoir alors "communiquer" avec l'instance précédente ? Par exemple lui envoyé un message(pour lui donner le focus par exemple)