Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Communication entre programmes Panoramic | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Communication entre programmes Panoramic Jeu 29 Juil 2010 - 17:47 | |
| J'ai fait une toute petite DLL (8,5 ko) contenant uniquement les routines de communication entre programmes contenues dans KGF.dll. C'est un moyen simple et léger d'envoyer des messages texte entre programmes Panoramic et être éventuellement averti de l'arrivée d'un message. Elle s'appelle IPC.dll (IPC=InterProcessCommunication) et est distribuée avec son programme de démo "test IPC.bas" sur mon site dans la distribution de KGF.dll. | |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 11:21 | |
| Ta DLL m'intéresse au plus au point, parce que presse papier c'est alléatoire par moment. Il y a des jours entier où aucun problème se pose, et d'autre je ne sais pas pourquoi, ça marche mal. J'étais en train de faire l'essai à travers un fichier dans un disque virtuel, mais si ta DLL fonctionne, je pense que c'est elle que je choisirais. J'ai pas encore réussi à communiquer entre les deux programmes. Ce qui serait bien est que tu mettes un programme dont on en copie un exécutable, et qui se communique entre eux. Il faudra donc que par le presse paier les infos du handle de départ, ils s'échangent avant de pouvoir utiliser les communications. A moins que je me sois trompé sur le fonctionnement. @+ |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 12:27 | |
| Pour résoudre ton problème, voici ce qu'il faut faire: 1. télécharger à nouveau KGF.dll à partir de mon site. Tu obtiendras un fichier KGF.17.zip. 2. décompresser ce fichier dans un répertoire à part. Dans ce répertoire, trois fichiers te concernent directement: - IPC.dll - test IPC.bas - Autres_DLL.rtf 3. commence par lire Autres_DLL.rtf, puis surtout les commentaires au début de "test IPC.bas" - c'est la doc complète 4. copier IPC.dll dans le répertoire de Panoramic Editor ET dans l ou les répertoires où se trouvent les éventuels exe qui sont concernés 5. décider du mode de communication. Il peut y avoir une communication uni-directionnelle programme A (EMETTEUR) --> programme B (RECEPTEUR) ou une communication bidirectionnelle programme A (EMETTEUR/RECEPTEUR) <--> programme B (RECEPTEUR/EMETTEUR) C'est l' programme EMETTEUR qui doit utiliser IPC.dll et le programme RECEPTEUR doit créer une boite à lettres. Dans le cas d'une liaison bi-directionnelle, les deux programmes doivent faire les deux opérations. 6. Créer les boites à lettres dans les programmes censés recevoir des messages. Une boite à lettres est un champ edit avec une valeur négative inférieure à -1000 pour top et left. De ce fait, le champ n'est pas visible à l'écran, mais est actif. On peut lui donner une routine d'évènement on_change pour être averti de l'arrivée d'un message. Exemple: - Code:
-
label message_recu edit 237 : top 237,-1129 : left 237,-1129 : on_change 237,message_recu ... message_recu: ' traiter ici la réception d'un message return
7. établir le lien avec les boites à lettres dans les programmes censés émettre des messages. Pour cela, il faut connaître la caption(0) EXACTE de la form 0 du RECEPTEUR, et la valeur de l'identifiant de la boite à lettres (-1129 dans l'exemple). Cette opération est à faire 1 fois, au début: - Code:
-
dim nom$,id%,hnd_boite% dll_on "IPC.dll" ... nom$ = "xxxx" : ' la caption EXACTE de la form 0 du RECEPTEUR id% = -1129 : ' l'identifiant de la boite hnd_boite% = dll_call3("IPCGetHandle",adr(nom$),len(nom$),id%) ' c'est la valeur de hnd_boite% qui servira d'adresse au messages
8. envoyer des messages. Pour cela, il faut préparer le message dans une variable string dont la longueur ne doit pas excéder la capacité d'un edit en Panoramic (c'est grand...). Voilà commment on fait: - Code:
-
dim mes$, res% ... mes$ = "xxxxx" : ' préparer le message res% = dll_call3("IPCSendMessage",adr(mes$),len(mes$),id%)
la valeur de res% n'a pas de signification. id% est l'identifiant utilisé pour établir le lien (voir ci-dessus). Avant tout, essaie le petit programme "test IPC.bas". Il crée deux boites à lettres et envoie des messages saisis à l'ecran dans l'une ou l'autre ce ces boites. | |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 14:40 | |
| J'ai un petit écran avec des petites lettres, et ça commence à m'énerver. J'arrive pas à suivre ici d'un texte à l'autre. Et ça jne marche pas. Je suis sure que ta DLL fonctionne, mais j'ai pas les bons outils pour y arriver.
Le mieux aurrait été d'avoir les 2 programmes pour la communications bi-directionnelle des programmes. Tant pis. J'arrète avant.... et puis j'arrète. Merci quant même. Quand j'aurais un écran plus large, et au chose comme navigateur, car celà, je n'en dis pas plus. Salutation |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 20:09 | |
| Je te poste un exemple bi-directionnel ce soir ! | |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 20:49 | |
| Voila ce que j'ai fait finalement: Programme à compiler qui sera appelé: - Code:
-
top 0,100: left 0,600 :height 0,160:width 0,400 dim handle_boite%,Recepteur$,id% , a$ dim i%,message$ label envoie , voir a$=clipboard_string_paste$ :clipboard_string_copy "" dll_on "Z:\IPC.dll"
Recepteur$="essai recoit" : caption 0, Recepteur$ id%=-1122 edit 1:top 1,id%:left 1,id% :on_change 1,voir handle_boite% = dll_call3("IPCGetHandle",adr(recepteur$),len(recepteur$),id%) edit 2:top 2,90:text 2,handle_boite% button 5:left 5,310:width 5,50:top 5,20:caption 5,"go":on_click 5,envoie alpha 8:left 8, 10:top 8,65:caption 8,"handle de cette boite"
dll_off ' ------------------------------------------------------------------------------ rem handle_boite% handle identifiant la boîte à letters pour IPCSendMessage rem Recepteur$ nom du récepteur (caption de la form 0) rem id% identifiant de la boîte à lettres (left et top du edit récepteur)
alpha 6:top 6,5:left 6, 30:caption 6,"réception" alpha 9:top 9,5:left 9,180:caption 9,"à envoyer" edit 10:font_size 10,12 :top 10,30:on_change 10,voir edit 11:font_size 11,12 :top 11,30:left 11,150 :text 11,"envoi" ' ------------------------------------------------------------------------------ clipboard_string_copy handle_boite% :' on envoi l'identification mais sans résultat handle_boite%=val(a$)
end ' _______ envoie: message$=text$(11) dll_on "Z:\IPC.dll" i% = DLL_call3("IPCSendMessage",adr(message$),len(message$),handle_boite%) ' i% sans signification, requis pour la syntaxe ' message$ le messate texte à envoyer ' handle_boite% handle de la boite à lettres (résultat de IPCGetHandle) dll_off return
voir: text 10,text$(1) return et le programme qui fait l'apel de l'autre: - Code:
-
top 0,100 :height 0,160:width 0,400 dim handle_boite%,Recepteur$,id% dim i%,message$ , a$ label envoie , voir ,clic
dll_on "Z:\IPC.dll"
Recepteur$="essai envoi" : caption 0,Recepteur$ id%=-1111 edit 1:top 1,id%:left 1,id% :on_change 1,voir handle_boite% = dll_call3("IPCGetHandle",adr(recepteur$),len(recepteur$),id%) edit 2:top 2,90:text 2,handle_boite% edit 3:top 3,90:left 3,150 button 4:left 4,310:top 4,90:width 4,20:caption 4,"IP":on_click 4,clic button 5:left 5,310:width 5,50:top 5,20:caption 5,"go":on_click 5,envoie alpha 6:left 6,10:top 6,65:caption 6,"handle de cette boite" alpha 7:left 7,150:top 7,60:caption 7,"handle de l'autre boite à reporter"+chr$(13)+" par copier/coller et clic bouton" dll_off ' ------------------------------------------------------------------------------ rem handle_boite% handle identifiant la boîte à letters pour IPCSendMessage rem Recepteur$ nom du récepteur (caption de la form 0) rem id% identifiant de la boîte à lettres (left et top du edit récepteur) alpha 8:top 8,5:left 8, 30:caption 8,"réception" alpha 9:top 9,5:left 9,180:caption 9,"à envoyer" edit 10:font_size 10,12 :top 10,30:on_change 10,voir edit 11:font_size 11,12 :top 11,30:left 11,150 :text 11,"envoi" ' ------------------------------------------------------------------------------ clipboard_string_copy handle_boite%
' NOM DU FICHIER execute "Z:\nouveau.exe" ' ici il faut que je'envoie les paramètres
a$=clipboard_string_paste$ :' pas bon handle_boite%=val(a$):text 3,a$ end ' _______ clic: handle_boite%=val(text$(3)) return
envoie: message$=text$(11) dll_on "Z:\IPC.dll" i% = DLL_call3("IPCSendMessage",adr(message$),len(message$),handle_boite%) ' i% sans signification, requis pour la syntaxe ' message$ le messate texte à envoyer ' handle_boite% handle de la boite à lettres (résultat de IPCGetHandle) dll_off return
voir: text 10,text$(1) return Le seul problème est que j'arrive que d'un côté à connaitre de handle de l'autre. Pour l'instant j'ai pas réussi avec le premier à reprendre de handle de l'autre. Est-ce que toi de ton côté tu as un principe pour que ça marche? Je voulais t'envoyé tout à l'heure mais il y a du monde et je ne peux continuer maintenant. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 21:45 | |
| Il me semble que pour trouver le handle de la boite dans laquelle tu veux envoyer un message (et qui est donc forcément dans l'autre programme !), tu utilises la même variable que celle utilisée pour mettre la caption de la form 0, donc du même programme ! C'est l'inverse qu'il faut faire: dans le programme dont la caption(0) est "essai recoit", il faut chercher le handle avec "essai envoi" et inversement. Je n'ai pas approfondi plus loin. Voici deux programmes, "Programme A" et "Programme B" qui sont symétriques et s'envoient des messages mutuellement, sur click d'un bouton. Le message à envoyer est à saisir dans le champ edit à gauche du bouton, et le champ edit en-dessous montre le message reçu. Les deux programmes sont à compiler en exe, puis il faut les lancer séparément. Lors du premier click sur un des boutons, le programme concerné se "connecte" sur la boite de messages de l'autre, puis envoie son message. Les clics suivants ne font plus qu'envoyer le message. Prendre soin de saisie chaque fois un message différent pour qu'on voie l'effet. Programme A: - Code:
-
' Programme A ' label message_recu, envoyer_message
dim id_boite_B%, mes$, nom_programme_B$, flag_connecte%, handle_B%, res%
caption 0,"Programme A" : width 0,400 : height 0,150
' déclarer la boite de réception du programme A edit 200 : top 200,-1401 : left 200,-1401 : on_change 200,message_recu
' pour trouver le programme B id_boite_B% = -1402 : ' ID le la boite de réception du programme B nom_programme_B$ = "Programme B" : ' caption(0) du programme B
' créer le GUI du programme edit 1 : top 1,10 : left 1,10 : width 1,200 button 2 : top 2,10 : left 2,240 : width 2,120 : caption 2,"Envoyer --> B" on_click 2,envoyer_message edit 10 : top 10,50 : left 10,10 : width 10,200 alpha 11 : top 11,50 : left 11,230 : caption 11,"<-- message reçu de B"
' charger la DLL et signaler "non connecté" dll_on "IPC.dll" flag_connecte% = 0
end
' évènement "message reçu" message_recu: text 10,text$(200) : ' action: visualiser le message reçu return ' envoyer un message à B envoyer_message: if flag_connecte%=0 : ' la première fois ? alors il faut se connecter handle_B% = dll_call3("IPCGetHandle",adr(nom_programme_B$),len(nom_programme_B$),id_boite_B%) flag_connecte% = 1 end_if mes$ = text$(1) : ' construire le message res% = dll_call3("IPCSendMessage",adr(mes$),len(mes$),handle_B%) : ' envoyer à B return
Programme B: - Code:
-
' Programme B ' label message_recu, envoyer_message
dim id_boite_A%, mes$, nom_programme_A$, flag_connecte%, handle_A%, res%
caption 0,"Programme B" : width 0,400 : height 0,150
' déclarer la boite de réception du programme B edit 200 : top 200,-1402 : left 200,-1402 : on_change 200,message_recu
' pour trouver le programme A id_boite_A% = -1401 : ' ID le la boite de réception du programme B nom_programme_A$ = "Programme A" : ' caption(0) du programme A
' créer le GUI du programme edit 1 : top 1,10 : left 1,10 : width 1,200 button 2 : top 2,10 : left 2,240 : width 2,120 : caption 2,"Envoyer --> A" on_click 2,envoyer_message edit 10 : top 10,50 : left 10,10 : width 10,200 alpha 11 : top 11,50 : left 11,230 : caption 11,"<-- message reçu de A"
' charger la DLL et signaler "non connecté" dll_on "IPC.dll" flag_connecte% = 0
end
' évènement "message reçu" message_recu: text 10,text$(200) : ' action: visualiser le message reçu return ' envoyer un message à B envoyer_message: if flag_connecte%=0 : ' la première fois ? alors il faut se connecter handle_A% = dll_call3("IPCGetHandle",adr(nom_programme_A$),len(nom_programme_A$),id_boite_A%) flag_connecte% = 1 end_if mes$ = text$(1) : ' construire le message res% = dll_call3("IPCSendMessage",adr(mes$),len(mes$),handle_A%) : ' envoyer à A return | |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Ven 30 Juil 2010 - 23:45 | |
| Je te remercie. Tes exemples fonctionnent. Je ferais une analyse dès que possible. Ta méthode est bien meilleurs. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Communication entre programmes Panoramic Sam 31 Juil 2010 - 0:10 | |
| Parfait. Bonne chance alors. Tu verras, une fois le principe compris, tu l'appliqueras facilement. | |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Sam 31 Juil 2010 - 17:38 | |
| Salut Klaus. Est-ce que je me trompe ou pas? J'ai voulu changer edit par memo avec la modification des instructions qui vont avec, pour pouvoir envoyer plusieurs lignes, comme je le fais avec le presse-papier, et ça ne fonctionne pas. Seul edit et memo utilise on_change. Sinon peut-il y avoir une adaptation avant que je bouleverse mes programmes? Merci d'avance. J'y pense, si c'est possible le memo reçoit des lignes disons de 150/200 caractères par lignes, ceci pour ne pas oublier que si il n'y a pas de bar horizontal, il peut inclure d'office un saut. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Communication entre programmes Panoramic Sam 31 Juil 2010 - 19:05 | |
| Il faut que je regarde si ça peut marcher avec un mémo. En attentant, il vaut mieux concaténer les lignes du mémo dans un seul string avec un cacartère de séparation, puis l'envoyer et à réception, le décomposer.
Pour le moment, le système est faut pour envoyer un seul string comme message. | |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Sam 31 Juil 2010 - 19:22 | |
| D'accord, je ferais avec. J'étais pas sûre d'avoir bien programmé. Laisse comme cela est. De toute façon si je commence une méthode, je n'ai pas l'intention de tout revoir ensuite.
Merci bien. |
| | | Invité Invité
| Sujet: Re: Communication entre programmes Panoramic Dim 1 Aoû 2010 - 12:57 | |
| J'ai repris le programme pour l'adapter et enlever les objets de démonstration pour faire les essais, vu que normalement on cummunique entre programmes par ordre (pour moi oui). J'ai fais 2 versions. Les deux même, mais la première faire un teste d'essai, et visualisé par un message de l'autre boite pour voir que cela fonctionne. Il n'y a qu'un seul programme, la différence est que l'orsque qu'on a mis les paramètres comme le nom du caption de chaque programme, et le numéro de l'EDIT de réception pour l'insérer dans le programme, on fait un copie/coller d'un programme à l'autre en ne changeant qu'un N°. Programme d'essai: - Code:
-
width 0,400 : height 0,150 label message_recu, envoyer_message , teste dim prg_choix% , Lautre_prg$ :' programme A ou B
rem "ATTENTION on compile avec prg_choix%=1 rem "Et avant d'essayer on remet prg_choix%=0 ' prg_choix% 0 ou autre. - c'est celui qui à 0 qui commence pour lancer l'autre
prg_choix%=0 :' VOIR CETTE LIGNE !!!
dim flag_connecte%, handle_B%, res% dim nom_prg_A$, id_boite_ici%, transf_obj% , mes$ dim nom_prg_B$, id_boite_la% , recu$
transf_obj%=1 :' N° du 1er objet à adapter nom_prg_A$ = "Programme A" : nom_prg_B$ = "Programme B" ' ------------------------------------ if prg_choix%=0 caption 0,nom_prg_A$:Lautre_Prg$ = nom_prg_B$:id_boite_ici%=-1402:id_boite_la%=-1144 else caption 0,nom_prg_B$:Lautre_Prg$ = nom_prg_A$:id_boite_ici%=-1144:id_boite_la%=-1402 :left 0,500 end_if ' --------------------------------------------- ' déclarer la boite de réception du programme edit transf_obj% : top transf_obj%,id_boite_ici% : left transf_obj%,id_boite_ici% on_change transf_obj%,message_recu ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\: if prg_choix%=0 then execute "Nouveau.exe" :' mettre le nom enregistré sachant ' que l'exécutable est avec ' prg_choix%=1 ' ATTENTION NE PAS FAIRE UN EXECUTABLE AVEC prg_choix%=0 SINON IL Y AURA ' EXECUTION A LA CHAINE DU PROGRAMME (il fera des petits), et pour arréter bonjour les dégats! ' ------------------------------------------------------------------------------ dll_on "IPC.dll" : flag_connecte% = 0 : ' charger la DLL et signaler "non connecté" on_click 0,teste end teste: ' mes$="":gosub envoyer_message mes$="je fais un teste"+chr$(10)+chr$(13)+"et je regarde" :gosub envoyer_message mes$="j'ai bien bu"+chr$(10)+chr$(13)+"j'ai bien mangé":gosub envoyer_message mes$="|stop|":gosub envoyer_message return ' ------------------------------------------------------------------------------ ' évènement "message reçu" message_recu: recu$=text$(transf_obj%) if instr(recu$,"|stop|")>0 then mes$=recu$:gosub envoyer_message : terminate message "recu de " + chr$(prg_choix%+65)+": "+recu$ return ' ------------------------------------------------------------------------------ ' envoyer un message à B envoyer_message: if flag_connecte%=0 : ' la première fois ? alors il faut se connecter handle_B% = dll_call3("IPCGetHandle",adr(Lautre_Prg$),len(Lautre_Prg$),id_boite_la%) flag_connecte% = 1 end_if res% = dll_call3("IPCSendMessage",adr(mes$),len(mes$),handle_B%) return Le Programme vidé des messages: - Code:
-
width 0,400 : height 0,150 label message_recu, envoyer_message dim prg_choix% , Lautre_prg$ , flag_connecte%, handle_B%, res% , mes$ dim nom_prg_A$, id_boite_ici%, transf_obj% , nom_prg_B$, id_boite_la% , recu$ rem "à adapter" prg_choix%=0 :' VOIR CETTE LIGNE !!! } " 0 ou autre " transf_obj%=1 :' N° du 1er objet à adapter nom_prg_A$ = "Programme A" : nom_prg_B$ = "Programme B" ' ------------------------------------ if prg_choix%=0 caption 0,nom_prg_A$:Lautre_Prg$ = nom_prg_B$:id_boite_ici%=-1402:id_boite_la%=-1144 else caption 0,nom_prg_B$:Lautre_Prg$ = nom_prg_A$:id_boite_ici%=-1144:id_boite_la%=-1402 :left 0,500 end_if ' --------------------------------------------- ' déclarer la boite de réception du programme } " OBLIGATOIRE" edit transf_obj% : top transf_obj%,id_boite_ici% : left transf_obj%,id_boite_ici% on_change transf_obj%,message_recu dll_on "IPC.dll" : flag_connecte% = 0 : ' charger la DLL et signaler "non connecté" end ' ------------------------------------------------------------------------------ ' évènement "message reçu" message_recu: recu$=text$(transf_obj%) : ' ici traitement message "recu de " + chr$(prg_choix%+65)+": "+recu$ return ' ------------------------------------------------------------------------------ ' envoyer un message à B envoyer_message: if flag_connecte%=0 : ' la première fois ? alors il faut se connecter handle_B% = dll_call3("IPCGetHandle",adr(Lautre_Prg$),len(Lautre_Prg$),id_boite_la%) flag_connecte% = 1 end_if res% = dll_call3("IPCSendMessage",adr(mes$),len(mes$),handle_B%) return Pour faire l'essai avec le premier programme, mettre prg_choix%=1 (autre que zéro, et compiler après avoir remis ensuite: prg_choix%=0, on peut faire l'essais en cliquant sur l'une ou l'autre forme J'envoie en vitesse, bizarre ce navigateur comme il réagi! |
| | | Contenu sponsorisé
| Sujet: Re: Communication entre programmes Panoramic | |
| |
| | | | Communication entre programmes Panoramic | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |