begin process at 2010 02 10 13:30:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Exécution

 > COMMUNICATION INTER-PROCESSUS (IPC)

COMMUNICATION INTER-PROCESSUS (IPC)


 Information sur la source

Note :
Aucune note
Catégorie :Exécution Classé sous :ipc, processus, communication, subclassing, sendmessage Niveau :Initié Date de création :15/02/2009 Date de mise à jour :15/02/2009 22:03:01 Vu / téléchargé :2 498 / 316

Auteur : MadM@tt

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


 Description

Bonjour à tous,

Voilà rien de nouveau, je ne suis même pas l'auteur de cette source, elle vient directement de la MSDN. Si je la poste, c'est que j'ai galéré plusieurs jours avant de tomber dessus par hasard, et que tout était déjà fait.
C'est donc pour pouvoir la diffuser que je la poste.

Il s'agit d'un exemple très simple de communication entre 2 applications (ou processus) différents. Si vous avez 2 programmes, et que vous voulez échanger des informations entre eux, voilà donc un exemple. La méthode employée est d'utiliser un message dédié à cela : WM_COPYDATA.

Ainsi, dans l'application A, vous récupérer le handle de la fenêtre de B qui va recevoir le message, et vous faites un SendMessage(hwnd, WM_COPYDATA, wParam, lParam).

Dans l'application B, la fenêtre destinée à recevoir le message doit être sous-classée (afin de pouvoir recevoir le message personnalisé). Lorsque l'évènement WM_COPYDATA arrive, il ne reste plus qu'à lire les données qui ont été transférées avec le message.

Présentation plus détaillée de la méthode :
http://blogs.codes-sources.com/madmatt/archive/2 009/02/15/communication-inter-processus-sous-windo ws-ipc.aspx

Ici, la données transférée est une chaine de caractère.
Le subclassing est fait grace à la DLL de vbAccelerator (version assembleur pour pas de plantage dans l'IDE).


 Conclusion

Voici le lien original dans la MSDN :
http://support.microsoft.com/kb/176058


En espérant que ça vous serve,

MadMatt

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

15 février 2009 21:40:32 :
Ajout du lien de la MSDN
15 février 2009 22:03:01 :
Lien

 Sources du même auteur

Source avec Zip OPÉRATIONS SUR LES CHAINES DE CARACTÈRE OPTIMISÉES ET ÉTENDU...
Source avec Zip Source avec une capture FISHTANK - SCREENSAVER INTERACTIF : AQUARIUM AVEC POISSONS V...
Source avec Zip Source avec une capture RÉCUPÉRER LA TEMPÉRATURE DES DISQUES DURS
Source avec Zip Source avec une capture WIN++ OPTIONS AVANCÉES SUR LES FENETRES ET PROCESSUS WINDOWS...
Source avec Zip Source avec une capture SUBCLASSING : SOUS-CLASSEZ FACILEMENT UNE FENETRE AVEC UN US...

 Sources de la même categorie

Source avec Zip APPEL DE POINTEUR DE FONCTIONS - API SANS LES DECLARER par Renfield
Source avec Zip Source avec une capture RETROUVER LES DONNÉES PUBLIQUES DANS UNE BIBLIOTHÈQUE par VBsearch
Source avec Zip Source avec une capture CRÉER VOTRE PROGRAMME D'INSTALLATION par VBsearch
Source avec Zip Source avec une capture BART VOTRE BUREAU DANS UNE BARRE par alfamick
Source avec Zip Source avec une capture Source .NET (Dotnet) SIMPLE SHUTDOWN SCHEDULER : ARRÊTS PLANIFIÉS (LOCAL OU REMOT... par violent_ken

 Sources en rapport avec celle ci

Source avec Zip COURS DE PILOTAGE........D'APPLICATIONS par Renfield
Source avec Zip Source avec une capture SYSTRAY + BALLOON EN UN SEUL CONTRÔLE UTILISATEUR par jack
Source avec Zip Source .NET (Dotnet) COMMENT DÉMARRER UN PROCESSUS SUR PC DISTANT DE MANIÈRE CACH... par violent_ken
Source avec Zip Source avec une capture Source .NET (Dotnet) YET ANOTHER (REMOTE) PROCESS MONITOR par violent_ken
MODULE DE COMMUNICATION ENTRE APPLICATION par PROTEUS91

Commentaires et avis

Commentaire de Renfield le 17/02/2009 07:48:00 administrateur CS

Dommage de se promener du coup avec une dll.
voir=> http://www.vbfrance.com/codes/MODULE-SUBCLASSER_38442.aspx

pas mal, c'est pratique cette API.
Ca va pour discuter, mais pour un échange de données efficace, privilégier d'autres vecteurs de communication.

les Pipes ou les sockets, par exemple.

Commentaire de MadM@tt le 17/02/2009 15:30:26

Effectivement, c'est ponctuel comme échange quand même.
Je l'ai utilisé dans le contexte suivant :
J'ai une DLL handler pour ajouter un item dans le menu contextuel de l'explorateur. Quand l'item est cliqué, dans ma DLL j'envoie un message à mon appli principale qui tourne en tache de fond pour que celle-ci effectue une action sur le fichier sélectionné.

Concernant le subclassing, pas ma ton module je l'avait déjà survolé mais j'avais pas percuté que l'IDE ne crashait pas avec. Mais perso j'aime bien avoir des DLL (pas trop, mais pour ce genre de truc), comme ça j'ai vraiment pas à me soucier de ça, le code ne me gène pas ça fait un fichier en moins. Et vu que je me trimballe déjà avec des DLL à enregistrer, une de plus ou de moins...
L'autre avantage est que je défini les messages que je veux sousclasser, comme ça ma procédure n'est pas appelée à chaque message mais uniquement à ceux surveillés.

Commentaire de facdaar le 23/02/2009 18:38:26

Perso, j'aurai utilisé des sockets.

Commentaire de MadM@tt le 23/02/2009 19:51:27

Pourquoi ?

Commentaire de Renfield le 24/02/2009 09:21:18 administrateur CS

ben il donne son avis perso ^^

concrêtement, le subclassing est plus 'naturel' qu'un dialogue a base de sockets.
moins gourmand, aussi.

après, tout est question de gouts...

Commentaire de MadM@tt le 24/02/2009 11:38:10

Oui oui je peux comprendre que cette méthode n'est qu'une parmi d'autres mais comme je n'en ai jamais utilisé d'autre j'aurais bien aimé savoir quels étaient les avantages des sockets, histoire de me faire aussi une opinion.

Commentaire de Renfield le 24/02/2009 11:41:17 administrateur CS

je vois pas d'avantage flagrant... peut etre plus simple a mettre en place... (un Winsock a poser, ca roule...)
pis tu peux causer d'une machine a l'autre...
et t'interfacer à ton naviguateur...


Commentaire de titicar le 02/03/2009 21:22:05

Bonjour,
J'ai souvent regardé sur ce site plusieurs sources concernant cette communication entre plusieurs prog, ou subclassing. On y est tous confronté un jour ou l'autre. Mais je ne l'ai pas encore utilisé.
Déjà, c'est d'un niveau 'pas pour tout le monde'. Et surtout, j'ai une grosse question sans réponse : dans tous les cas que j'ai vu, il faut 'fermer' cette communication avant de quitter le prog (chez MadM@tt : 'DetachMessage Me, Me.hwnd, WM_COPYDATA' dans Form\Unload). Mais que se passe t-il si notre prog se ferme brutalement (face à une erreur non gérée et sans doute, sans passer par Unload)? Windows va t-il continuer d'envoyer un message à un prog qui ne tourne plus?
C'est sûr, je ne suis vraiment pas initié dans ce domaine... D'où cette question.

Commentaire de MadM@tt le 02/03/2009 21:39:15

Tu viens de soulever le plus gros inconvénient du subclassing (mis à part qu'il est fastidieux à mettre en place) : quand on stoppe l'exécution, ou que le programme termine brutalement en non-compilé, l'IDE plante. Je ne peut pas trop t'expliquer pourquoi (je ne connais pas les détails), mais en gros Windows essaye d'envoyer des messages à une fonction d'un programme qui n'existe plus.
Ce n'est pas un problème en mode compilé (mais je ne sais pas en détail ce que deviennent les messages dans ce cas) puisque ça n'arrive que lorsque l'application est déjà en train de planter.
Il est possible d'utiliser certains codes qui évitent ce phénomène (avec de l'injection assembleur par exemple). J'utilise dans ce code une DLL (pas de moi) qui gère ce problème. Tu peux jeter un coup d'oeil au code si tu veux, mais avant d'utiliser ce genre de DLL je te conseille d'essayer de regarder un code de subclassing complet avant, pour bien comprendre le fonctionnement.

Je me souviens avant d'avoir touché au subclassing, ça me paraissait une montagne, mais en fait c'est pas si compliqué (il faut passer au delà des appels d'API) et ça t'aide à comprendre la structure des fenêtres windows et ce qu'il se cache derrière tes évènements VB.

Commentaire de titicar le 02/03/2009 23:32:55

MadM@tt : C'est ce que j'appelle une réaction rapide !
Tu me rassures sur un point : ce n'est pas un problème en mode compilé (... à surveiller quand même).
Du coup, je vais m'y intéresser, et comme tu l'as dit, en regardant des sources plus simples ou complètes que le code de VbAccelerator. Ce ne sont sans doute pas les exemples qui manquent sur VBFrance.
Et merci pour ta réponse rapide !

Commentaire de Renfield le 03/03/2009 08:54:58 administrateur CS

"ce n'est pas un problème en mode compilé (... à surveiller quand même)."

NON... ca n'est pas un soucis en compilé. Marginal (et encore) en VB, les applications graphiques Windows sont baties sur cette gestion des messages.
Tu imagine bien que depuis le temps...

Par la force des choses, moins de messages sont transmis a windows pour une appli qui vient de crasher (plus de messages souris, etc.)
mais windows sait a quel processus est liée la fenetre dont le handle est transmis et saura si le process est là ou non.
Du coup non. Pas de soucis en compilé.

Comme l'évoquait MadM@tt, le seule soucis est en mode debug.
La fenetre est là. On a demandé a recevoir les message la concernant dans une procédure VB.
mais lorsque le programme plante, VB6.exe reste là. C'est à lui que sont liées les fenetres créées. Du coup, les messages continuent d'arriver et crash.
C'est la même chose lorsque l'on stoppe le programme. Encore le même crash lorsque l'on place un point d'arret, puisque le programme n'est pas en mesure de traiter le message recu.

avec des solutions mises en oeuvre ici, par exemple :
http://www.vbfrance.com/codes/MODULE-SUBCLASSER_38442.aspx

les messages sont redirigés vers un mini morceau de code assembleur, lequel reste chargé en mémoire. Il teste si on est en mode debug (execution en pause) ou non.
Si oui, on refile les messages au traitement standard.
Si non, on est bon, on refiles les billes a la procedure de subclassing VB6.

J'ai pas eu de crash jusque là.

A noter également que ce test du mode debug ou non n'est pas fait, lors de l'execution du code en .exe


Au final, le fait de détacher le subclassing rend les choses plus propres.
Il est conseillé de le faire. Mais si l'appli a crashé, le mal est fait ^^

Je me tiens a ta disposition pour tout éclaircissement...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

CreateNamePipe / SendMessage / Appli Communication [ par PROTEUS91 ] Bonjour a tous, Je cherche une solution de communiquer des informations entre deux applications Visual Basic, mais sans utiliser de Control Winsock. communication entre applications VB, pipes, IPC,... [ par krinin ] bonjour, je recherche des solutions (infos, codes,..) pour faire communiquer deux applications ecrites en vb (dll, exe,..). je sais qu'il existe les p communication inter-processus avec fenêtre invisible [ par adri85 ] Bonjour,Je développe une application qui doit communiquer avec d'autres applications (exe) que j'ai créé en invisible (pour ne pas les voir dans la ba communication avec le port parallèle ? [ par Jacky7 ] Bonjour a tous,J'ai réalisé un prog sous VB6 utilisant le port parallèle, seulement on dirai que la dll que j'ai utilisé (inpout32.dll) n'est pas comp communication RS232 [ par pgfgme ] bonjour,je suis actuellement entrain de travailler sur une appli de transfert de données en RS232 entre mon PC et une carte électronique et je suis to 2ième procesus Excel.exe, après mise à jour du lien, qui prende de plus en plus de mémoire [ par Witold ] Bonjour,J'ai un problème avec un fichier Excel qui est lié à un autre, Lorsque Excel me demande si je veux mettre à jour mon lien, un deuxième process [Recherche]Detection de processus ? [ par belette321 ] Je cherche un code pour la detection de processus existantet si le processus voullu existe le tuer, je veut preciser sa sera un anti-cheat ... merci d Comment faire une boucle ?!? [ par belette321 ] Comment puige faire une boucle, pour que mon programe face constamment la meme action J'ai essayerPublic sub Test()WhileSet xObj = GetObject("winmgmts sendmessage postmessage api [ par marty14 ] Bonsoir tt le monde,J' ai une petite question a vous poser ,  j'utilise les API SENDMESSAGELONG pour envoyer une commande a un programme mais mon peti Utilisation de ReadProcessMemory [ par fourne ] Bonjour je souhaiterais pouvoir récupérer des valeurs de variables appartenant à un autre processus, exemple : récupérer les informations d'une fenêtr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,905 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales