PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Comment faire ? Application A lance une procédure d'Application B
Comment faire ? Application A lance une procédure d'Application B
Started by Julien, Oct., 18 2018 12:09 PM - 43 replies
Posted on October, 18 2018 - 12:09 PM
Bonjour,

(Déjà je suis en Windev 23)

Sur un même PC, j'ai 2 applications Windev qui sont lancés et développés par moi-même.

Je voudrais cliquer sur un bouton de l'application A, qui devrait exécuter une procédure de l'application B.

Comment faire svp ?

Merci d'avance.
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on October, 18 2018 - 1:59 PM
Coucou,

Il te faut utliser les mutex :
Les mutex peuvent être partagés ou non entre les différentes applications exécutées sur le poste
Il suffit d'indiquer le mode de partage des mutex lors de leur création (fonction MutexCrée).

Reference: https://doc.pcsoft.fr/?1000019475

--
In üs we trust - #92i

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Message modified, October, 18 2018 - 2:03 PM
Registered member
281 messages
Popularité : +24 (26 votes)
Posted on October, 18 2018 - 2:10 PM
Je ne vois pas en quoi un mutex va faire communiquer les 2 applications...
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on October, 18 2018 - 2:35 PM
Coucou,

Je voudrais cliquer sur un bouton de l'application A, qui devrait exécuter une procédure de l'application B


@Damien :
Dans le cas de partage de donnée , je verrouille toujours les accées partager via des mutexs, sémaphore ou section critique.

Une fois la zone mémoire définit dans ton mutex, tu peut utiliser le mécanismes de synchronisation et les fonctions callback .
Reference:
https://doc.pcsoft.fr/?1000018934

--
In üs we trust - #92i

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Message modified, October, 18 2018 - 2:43 PM
Registered member
1,144 messages
Popularité : +50 (142 votes)
Posted on October, 18 2018 - 2:43 PM
Bonjour,

Il y a peut-être mieux mais je propose ceci :
L'application A écrit dans un fichier type ini et met à une "variable" à vrai
La procédure de l'application B va lire cette même variable (via un timer toutes les secondes), si la "variable" est à vrai alors exécute la procédure et on met la "variable" du fichier ini à faux.
Ou bien cette variable est dans un fichier de données.

Cela suppose que les deux applications soient lancées.
Voilà ce qui me vient à l'esprit, sans vouloir faire trop compliqué.
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on October, 18 2018 - 3:03 PM
THIERRY TILLIER a écrit :
Bonjour,

Il y a peut-être mieux mais je propose ceci :
L'application A écrit dans un fichier type ini et met à une "variable" à vrai
La procédure de l'application B va lire cette même variable (via un timer toutes les secondes), si la "variable" est à vrai alors exécute la procédure et on met la "variable" du fichier ini à faux.
Ou bien cette variable est dans un fichier de données.

Cela suppose que les deux applications soient lancées.
Voilà ce qui me vient à l'esprit, sans vouloir faire trop compliqué.


Coucou THIERRY,

Je ne pense pas que cela soit chose à faire.

J'insite sur mutex + zone mémoire partagé :




--
In üs we trust - #92i

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Message modified, October, 18 2018 - 3:04 PM
Registered member
1,623 messages
Popularité : +100 (114 votes)
Posted on October, 18 2018 - 3:17 PM
Pour faire dialoguer les applications, on peut utiliser les sockets :
https://doc.pcsoft.fr/fr-FR/?3070008

L'application B se met en écoute sur un socket donné;
L'application A envoi une demande a l'application B via ce socket.
L'application B étant en écoute sur ce socket, reçoit l’ordre et l’exécute.

Webinaire de Jerôme Aerts sur les sockets :
https://blogs.pcsoft.fr/fr/webinaire-jeudi-31-mai-11h-travail-collaboratif-modifier-fiche-client-quatre-mains/281474976710742/read.awp
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on October, 18 2018 - 3:21 PM
François C. a écrit :
Pour faire dialoguer les applications, on peut utiliser les sockets :
https://doc.pcsoft.fr/fr-FR/?3070008

L'application B se met en écoute sur un socket donné;
L'application A envoi une demande a l'application B via ce socket.
L'application B étant en écoute sur ce socket, reçoit l’ordre et l’exécute.

Webinaire de Jerôme Aerts sur les sockets :
https://blogs.pcsoft.fr/fr/webinaire-jeudi-31-mai-11h-travail-collaboratif-modifier-fiche-client-quatre-mains/281474976710742/read.awp


Coucou François,

Je ne pense pas non plus que cela soit chose à faire dans ce cas précis.

Julien précise :
Sur un même PC, 
j'ai 2 applications Windev qui sont lancés et développés par moi-même.


--
In üs we trust - #92i

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Registered member
190 messages
Popularité : +21 (23 votes)
Posted on October, 18 2018 - 3:30 PM
Charly CANDO a écrit :
THIERRY TILLIER a écrit :
Bonjour,

Il y a peut-être mieux mais je propose ceci :
L'application A écrit dans un fichier type ini et met à une "variable" à vrai
La procédure de l'application B va lire cette même variable (via un timer toutes les secondes), si la "variable" est à vrai alors exécute la procédure et on met la "variable" du fichier ini à faux.
Ou bien cette variable est dans un fichier de données.

Cela suppose que les deux applications soient lancées.
Voilà ce qui me vient à l'esprit, sans vouloir faire trop compliqué.


Coucou THIERRY,

Je ne pense pas que cela soit chose à faire.

J'insite sur mutex + zone mémoire partagé :




--
In üs we trust - #92i

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Message modifié, 18 octobre 2018 - 15:04



Très intéressant!! :D
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on October, 19 2018 - 12:28 PM
@Charly CANDO: Je comprends que tu veuilles défendre ta solution de zone partagée et de mutex, mais la solution des sockets me parait plutôt intéressante.

Prenons le cas ou l'application B est déployée sur plusieurs PC différents, l'application doit envoyer l'information à toutes les applications B. Les sockets fonctionneront alors que la zone partagée ne fonctionnera pas et il faudra donc développer de nouveau cette partie.

Il n'y a pas toujours qu'une seule solution à un problème et il faut parfois savoir envisager se projeter pour le futur.

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
69 messages
Popularité : +4 (4 votes)
Posted on October, 19 2018 - 1:02 PM
Bonjour,

Il est également possible de communiquer entre applications via les messages windows. (Postmessage,SendMessage)

Par exemple , l'application A récupère l'handle d'un fenêtre de l'application B (SysFenHandle), lui envoi un message.

La fenêtre de l'application B intercepte le message via la procédure evenement() et exécute une procédure.

Bon développement
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on October, 19 2018 - 2:41 PM
Coucou Philipe SB,

Je te recommande pour tes prochains développement de t'inspirer de la méthode LEAN.
Sont 4° principe et particulièrement intéressant dans ce cas de figure.

Ne pas écrire de code qui n'est pas nécésaire,
En LEAN le code doit rester le plus simple possible.


Concretement ? Voila l’example d'un principe simple (4:00) :



#Friday #LaRoueDeLaMethode #10 #WLoodies #PasDeCodeSuperflu


--
In üs we trust - #92i - #LaPiraterieNestJamaisFinie

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Message modified, October, 19 2018 - 2:54 PM
Posted on October, 19 2018 - 3:49 PM
Bonjour,

Merci pour toutes ces réponses, pas mal de pistes à investiguer :)

- La méthode avec les sockets semble intéressante

- La méthode avec les sendmessage semble mieux convenir.

Auriez-vous un petit exemple de code basique avec la méthode sendmessage associé avec évènement() ?

Merci beaucoup !
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on October, 19 2018 - 4:28 PM
@Charly CANDO

Je te remercie beaucoup de t'inquiéter de mes développements futurs, mais je n'en ai pas besoin. Je remarque d'ailleurs, après m'être longuement documenté, que j'applique une grande partie de ces principes sans même les avoir lus, ce qui prouve que je dois avoir une once de bon sens.

Je vois que ta bible est le TDF, grand bien te fasse, mais il ne faut pas tout prendre pour argent comptant. Le principe de LEAN que tu cites est principalement de factoriser le code au maximum pour écrire le moins de code possible. Cela a aussi des effets pervers de complexifier un code qui au départ était simple en y rajoutant des cas tordus, avec le risque de ne jamais réussir à le debugger. C'est aussi préciser dans la méthode LEAN.

Lorsque je prévois un développement, j'essaye de penser au plus de choses possibles sans me perdre dans les détails.

De plus je doute que coder des sockets soit plus long et contraignant que la zone mémoire, les mutex et les threads. Dans la méthode des sockets qui mettra autant de temps que celle que tu proposes, si le cas se présente, je pourrais l'utiliser sur un réseau de machines sans modification. Dans ton cas, il faudra tout reprendre et repartir de zéro, ce qui va à l'encontre des principes de LEAN que tu sembles affectionner tout particulièrement. Cela entraîne un coût supplémentaire de développement, non prévu par le client, qui peut parfois être extrêmement important.

Maintenant nous avons tous une façon différente de développer et à priori nous n'avons pas la même.

Je te conseille donc de te renseigner correctement lorsque tu annonces quelque chose et ne pas te baser que sur une vidéo pour tes recommandations.

Pour info, voici quelques liens sur LEAN:
http://www.disciplinedagiledelivery.com/lean-principles/
http://agile-lean-et-compagnie.com/2014/01/lart-du-lean-software-developpement/
https://agilevelocity.com/lean/7-principles-of-lean-software-development/
https://www.cs.colorado.edu/~kena/classes/5828/s12/presentation-materials/schweikertmarcbubernakchris.pdf
http://ses-perso.telecom-paristech.fr/LEANSI/2008-11%20LeanSI%20%2030%20min%20-%20Yahoo.pdf

et même un petit bouquin en pdf pour tes longues nuits d'hiver: http://ptgmedia.pearsoncmg.com/images/9780321150783/samplepages/0321150783.pdf

Bonne lecture, tu comprendras assez rapidement que ce que tu proposes va à l'encontre de ton principe de la méthode LEAN.

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on October, 20 2018 - 3:58 AM
Philippe SB a écrit :
@Charly CANDO

Je te remercie beaucoup de t'inquiéter de mes développements futurs, mais je n'en ai pas besoin. Je remarque d'ailleurs, après m'être longuement documenté, que j'applique une grande partie de ces principes sans même les avoir lus, ce qui prouve que je dois avoir une once de bon sens.

Je vois que ta bible est le TDF, grand bien te fasse, mais il ne faut pas tout prendre pour argent comptant. Le principe de LEAN que tu cites est principalement de factoriser le code au maximum pour écrire le moins de code possible. Cela a aussi des effets pervers de complexifier un code qui au départ était simple en y rajoutant des cas tordus, avec le risque de ne jamais réussir à le debugger. C'est aussi préciser dans la méthode LEAN.

Lorsque je prévois un développement, j'essaye de penser au plus de choses possibles sans me perdre dans les détails.

De plus je doute que coder des sockets soit plus long et contraignant que la zone mémoire, les mutex et les threads. Dans la méthode des sockets qui mettra autant de temps que celle que tu proposes, si le cas se présente, je pourrais l'utiliser sur un réseau de machines sans modification. Dans ton cas, il faudra tout reprendre et repartir de zéro, ce qui va à l'encontre des principes de LEAN que tu sembles affectionner tout particulièrement. Cela entraîne un coût supplémentaire de développement, non prévu par le client, qui peut parfois être extrêmement important.

Maintenant nous avons tous une façon différente de développer et à priori nous n'avons pas la même.

Je te conseille donc de te renseigner correctement lorsque tu annonces quelque chose et ne pas te baser que sur une vidéo pour tes recommandations.

Pour info, voici quelques liens sur LEAN:
http://www.disciplinedagiledelivery.com/lean-principles/
http://agile-lean-et-compagnie.com/2014/01/lart-du-lean-software-developpement/
https://agilevelocity.com/lean/7-principles-of-lean-software-development/
https://www.cs.colorado.edu/~kena/classes/5828/s12/presentation-materials/schweikertmarcbubernakchris.pdf
http://ses-perso.telecom-paristech.fr/LEANSI/2008-11%20LeanSI%20%2030%20min%20-%20Yahoo.pdf

et même un petit bouquin en pdf pour tes longues nuits d'hiver: http://ptgmedia.pearsoncmg.com/images/9780321150783/samplepages/0321150783.pdf

Bonne lecture, tu comprendras assez rapidement que ce que tu proposes va à l'encontre de ton principe de la méthode LEAN.

--
Cordialement,

Philippe SAINT-BERTIN

Mais sa ?! c'est pas LEAN-Philipe ... #IlsOntPasCompris


--
In üs we trust - #92i - #LaPiraterieNestJamaisFinie

Pistolet en Belgique - #DébrouillardAJamais
Wódka en Pologne - #RegardeLàOùJeSuisCarJeSuisLàOùIlFautÊtre
Message modified, October, 20 2018 - 4:30 AM
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on October, 21 2018 - 2:22 PM
Mais sa ?! c'est pas LEAN-Philipe ... #IlsOntPasCompris


Quand tu auras grandi on comprendra ce que tu veux dire.

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
329 messages
Popularité : +28 (32 votes)
Posted on October, 21 2018 - 10:10 PM
Dans une autre vie (C, C++) pour répondre à ce genre de problématique, la solution retenu était les canaux nommés (PIPE), ils fonctionnent aussi en réseau :merci:
Message modified, October, 21 2018 - 10:13 PM
Posted on October, 21 2018 - 10:49 PM
Bonsoir,

les méthodes proposées sont intéressantes. Je déconseille toutefois la méthode du fichier ini est qui compliqué à synchroniser (mais qui fonctionne tout de même).

Zone mémoire partagée, send message et socket sont de très bonnes pistes avec leurs points forts et leurs inconvénients.
- Zone mémoire partagée : limitée à un seul poste et j'ai eu parfois des problèmes de plantage
- SendMessage : on descend au niveau de l'OS et c'est limité à un seul poste
- Socket : On peut l'utiliser entre plusieurs postes, mais on peut avoir des problèmes de pare-feu (ouverture d'un port) qui sont à prendre en compte.

Mais avant de songer à partir dans telle ou telle direction (et ça a l'air d'un sacré débat), il serait intéressant de savoir exactement le problème à résoudre.

@Julien, dans quel cas particulier vous trouvez-vous pour qu'un clic sur un bouton d'un programme que vous avez développé lance une procédure d'un autre programme que vous avez développé ?

La communication inter-programme devrait être évitée quand elle peut l'être car il est très difficile de détecter et corriger les bugs en utilisant ce genre de mécanisme.

Peut-être qu'avec plus de détail, nous pourrions vous fournir une autre alternative ? Par exemple, un partage de la fonctionnalité entre les deux projets.

N'hésitez pas à nous en dire plus, je suis assez curieux de connaître votre cas.

Bonne soirée à vous !
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on October, 22 2018 - 8:59 AM
Dans une autre vie (C, C++) pour répondre à ce genre de problématique, la solution retenu était les canaux nommés (PIPE), ils fonctionnent aussi en réseau

je ne connaissais pas. J'ai rapidement jeté un œil, je ne sais pas si la mise en place est aisée. Ce serait intéressant de le tester… Si un jour j'ai un peu de temps j'essaierai. :D

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
190 messages
Popularité : +21 (23 votes)
Posted on October, 22 2018 - 9:34 AM
une autre piste si HF serveur en utilisant HEnvoieMessageVersClient
https://doc.pcsoft.fr/?3044346&name=henvoiemessageversclient_fonction

Dans l'envoi du message, on y passe un parametre personnalisé dans le message.

Dans le programme qui reçoit le message, on utilise hsurappelserveur
https://doc.pcsoft.fr/?3044343&name=hsurappelserveur_fonction

avec le parametre passé dans le message via HEnvoieMessageVersClient, on execute la procédure associée
Registered member
69 messages
Popularité : +4 (4 votes)
Posted on October, 22 2018 - 11:34 AM
Bonjour Julien,

Je vais essayer d'expliquer simplement.

Comme expliqué dans mon message du 19, le principe est d'intercepter un événement Windows pour exécuter une procédure.

Dans l'application B, il faut créer une procédure qui sera applelée lors de chaque réception d'un message spécifique.

1) Pour identifier ce message, j'ai choisi WM_USER+1300. (Voir si besoin Winconst.wl et ne pas oublier de l'intégrer)
https://doc.pcsoft.fr/fr-FR/?1511013&name=EXTERNE
Nb : Ce n° message sera utilisé dans les deux applications.

2) Je crée une procédure globale ou local à la fenêtre de réception de l'application B.
Par exemple :

PROCÉDURE HelloWorld()
Trace("hello world")

3) J'initialise l’événement dans l'initialisation de la fenêtre.

// EXTERNE "WinConst.wl"

gnEv est un entier

gnEv=Evénement("HelloWorld","*.*",WM_USER+1300)

SI gnEv=0 ALORS
Trace("Erreur init Evenement")
FIN

4) Dans l'application A.

Dans le code du bouton.

nHwnd est un entier

// nHwnd=Handle("FEN_B") // Pour fenêtre dans la même application. (soeur, mdi ....)
nHwnd=SysFenHandle("FEN_B") // Pour fenêtre dans une autre application.

SI nHwnd = Null ALORS
Trace("Fenêtre FEN_B non trouvée")
retour
fin

SendMessage(nHwnd,WM_USER+1300,0,0)

Voila, ça devrai fonctionner et pouvoir servir de trame.

J'aime également la solution de Nicolas CAILLIEZ qui passe par HFSQL, elle est simple et exploitable
en réseau (et sans entrer dans une usine à gaz.) :merci:

Bon développement
Registered member
96 messages
Popularité : +18 (20 votes)
Posted on October, 22 2018 - 1:55 PM
Bonjour,

je vais essayer de proposer une petite simplification au code de @Marret.

Pour chaque fonctionnalité que l'on souhaite appeler, je définis une constante pour chaque message / événement que je souhaite partager :

Ensuite, dans chaque projet qui doit réagir à ces événements , je définis un événement dans le projet:

CONSTANTE
_MESSAGE_ = "MESSAGE_TEST"
_MESSAGE_2_ = "MESSAGE_TEST 2"
FIN

Evénement(_tester_01, "*.*", _MESSAGE_)
PROCEDURE INTERNE _tester_01(_message)
Trace(ChaîneConstruit("Evenement '%1' reçu", _message))
FIN

Evénement(_tester_02, "*.*", _MESSAGE_2_)
PROCEDURE INTERNE _tester_02(_message)
Trace(ChaîneConstruit("Evenement '%1' reçu", _message))
FIN


Pour tester simplement, on peut rajouter ce code dans chaque fenêtre qui doit réagir.

Ensuite, pour déclencher l'événement, il suffit d'utiliser le code suivant :

PostMessage(-1, _MESSAGE_, 0, 0)
// ou SendMessage(-1, _MESSAGE_, 0, 0)


Explication :
Lorsqu'on crée un événement, il n'est plus nécessaire de l'associer à un n° d'évenement. WinDev est capable de créer un nouveau n° d'événement en fonction d'une chaîne de caractères. Cela simplifie énormément la réutilisabilité du code et surtout, on laisse le soin à WinDev de choisir le n° d'événement. Ce serait dommage de prendre un n° déjà utilisé.

La deuxième étape, c'est d'indiquer -1 dans la fonction PostMessage. Cela signifie que l'on s'adresse à tout le monde. C'est les constantes "MESSAGE_TEST et "MESSAGE_TEST 2" qui permettent de savoir si le programme doit traiter ou non le message. On évite ainsi d'utiliser le Handle ou le SysFenHandle.

Pour information, SendMessage est bloquant contrairement à PostMessage. Cela veut dire qu'il faut qu'il y ait au moins une réception de l'événement pour que SendMessage rende la main.

J'espère que ces détails supplémentaires vous permettront d'utiliser encore plus facilement la fonction PostMessage. Et cela me donne envie d'écrire un nouvel article de blog.

Par contre, je reviens sur ma question initiale, quel est le besoin réel ? De mon point de vue, on ne doit utiliser ce genre de technique que lorsqu'on n'a pas le choix, car cela rajoute de la confusion dans le code (que se passe-t-il si l'application B n'est pas lancée ?).

N'hésitez pas à donner plus de détails pour que l'on puisse réfléchir aussi à l'architecture des applications.

Bonne journée !

--
Johjo aka Jonathan Laurent

Codez mieux ! Codez plus vite !

Mon blog sur WinDev : http://www.ytreza.org
Me contacter sur slack (wx-community) : https://frama.link/BoBD0SY0
Faîtes moi un ping : http://www.ytreza.org/fr/services/ping-sur-forum
Registered member
69 messages
Popularité : +4 (4 votes)
Posted on October, 22 2018 - 4:04 PM
Merci Johjo,

J'utilise ces fonctions depuis des années, mais je viens d'apprendre qu'il était possible
d'identifier mon message par une chaine.

Fabuleux ce métier :)
Registered member
96 messages
Popularité : +18 (20 votes)
Posted on October, 22 2018 - 5:08 PM
C'est un plaisir.

Et c'est normal de passer à côté de choses comme ça (la documentation n'est pas très claire quand on regarde directement PostMessage et SendMessage).

--
Johjo aka Jonathan Laurent

Codez mieux ! Codez plus vite !

Mon blog sur WinDev : http://www.ytreza.org
Me contacter sur slack (wx-community) : https://frama.link/BoBD0SY0
Faîtes moi un ping : http://www.ytreza.org/fr/services/ping-sur-forum
Posted on October, 23 2018 - 9:05 AM
Bonjour à tous...

pas mal de propositions techniques ...

perso j'en ai une toute simple : appeler l'application 2 en passant une ligne de commande. (Lance appli)

et dans l'application 2 en code d'ouverture je recup la ligne de commande, et selon, j'appelle ma procedure et à la fin je referme l'exe.

c'est simple. apres ce n'est peut etre pas ce que l'auteur recherche...

genre :
dans le bouton :
monapplialancer est une chaine = "c:\toto.exe"
malignedecommande est une chaine = "maprocedure"

// on peut aussi passer des parametres en plus
monparam1 est une chaine = "param1"

Alancer est une chaine = monapplialancer + " " +malignedecommande

// si on veut aussi passer le parametre
Alancer += " " + monparam1

nres = LanceAppli(Alancer )


dans appli B, code initialisation du projet :

Selon LigneCommande(1) ALORS
CAS "maprocedure"
executetraitement(maprocedure,trtprocedure)

// si un parametre passé , on recup LigneCommande(2)
executetraitement(maprocedure,trtprocedure,LigneCommande(2))

//etc...
FinProgramme()

AUTRE CAS

FIN
FIN

on peut peaufiner avec des indirections



voilà c'est tout simple et ça fait le café
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on October, 23 2018 - 12:09 PM
@cdm98: Cela ne fonctionne que si l'application est fermée. Si elle est ouverte ta proposition ne fonctionne pas.

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
23 messages
Popularité : +4 (4 votes)
Posted on October, 23 2018 - 2:53 PM
Bonjour,

On utilise les fonctions DDE pour faire communiquer les applications que nous développons.

https://doc.pcsoft.fr/?3028015&name=ddeconnecte_fonction

On se connecte à l'application, on envoie un message et on traite l'information.
Ce n'est pas compliqué et facile à mettre en place.
Posted on October, 23 2018 - 3:22 PM
Philippe SB a écrit :
@cdm98: Cela ne fonctionne que si l'application est fermée. Si elle est ouverte ta proposition ne fonctionne pas.

--
Cordialement,

Philippe SAINT-BERTIN


bonjour philippe

bien sur que si ça fonctionne !

ça lance une deuxième instance de l'exe !

il faut juste pour cela dire qu'on peut avoir plusieurs instances du meme exe...

Cordialement
Posted on October, 23 2018 - 3:25 PM
Julien CLOQUET a écrit :
Bonjour,

On utilise les fonctions DDE pour faire communiquer les applications que nous développons.


bonjour,

vous voulez tous faire communiquer les applications.

ce n'est pas ce qu'il veut reellement :
"Je voudrais cliquer sur un bouton de l'application A, qui devrait exécuter une procédure de l'application B."

juste sur un bouton, au clic, lancer qq chose d'un autre exe.

désolé, j'insiste, mais le plus simple c'est le lanceappli avec un parametre...

cordialement
Registered member
96 messages
Popularité : +18 (20 votes)
Posted on October, 23 2018 - 4:33 PM
@cdm98
Julien indique au début de son message que les applications sont lancées

Je le cite :
Sur un même PC, j'ai 2 applications Windev qui sont lancés


Mais je suis d'accord avec toi, il n'est peut-être pas nécessaire de faire communiquer les applications, comme il n'est peut-être pas nécessaire d'utiliser la fonctionnalité de la deuxième application.

Malheureusement, sans détail supplémentaire de la part de Julien, nous ne pouvons que spéculer. Pour ma part, j'aurai aussi envie de lui proposer l'utilisation des composants pour avoir les fonctionnalités dans les deux applications, la possibilité de dupliquer les sources via le GDS et je ne sais quelles autres méthodes.

Dans tous les cas, ça m'a permis d'écrire un article, je suis bien content :)

--
Johjo aka Jonathan Laurent

Codez mieux ! Codez plus vite !

Mon blog sur WinDev : http://www.ytreza.org
Me contacter sur slack (wx-community) : https://frama.link/BoBD0SY0
Faîtes moi un ping : http://www.ytreza.org/fr/services/ping-sur-forum
Registered member
2,571 messages
Popularité : +222 (260 votes)
Posted on October, 24 2018 - 7:05 AM
bonjour philippe

bien sur que si ça fonctionne !

ça lance une deuxième instance de l'exe !

il faut juste pour cela dire qu'on peut avoir plusieurs instances du meme exe...


Je continue à dire que ta méthode ne fonctionne lorsque l'exe n'est pas lancé. Si je veux rafraichir la liste de l'application B, ta méthode ne fonctionne pas.

--
Cordialement,

Philippe SAINT-BERTIN
Registered member
309 messages
Popularité : +31 (37 votes)
Posted on October, 24 2018 - 11:55 AM
La réponse donnée par Marret et Joh Joh est la meilleure possible à la question.

Comment, depuis un programme A, demander à un programme B d' exécuter un traitement : en lui envoyant un message lui demandant gentiment de le faire !

(Gentiment signifie qu'on lui envoie un message auquel il s'attend)

Le système de messages inter-processes de windows a été créé tout exprès pour cela...

Bon dev.
Message modified, October, 24 2018 - 11:57 AM
Registered member
1,623 messages
Popularité : +100 (114 votes)
Posted on October, 24 2018 - 3:07 PM
Plusieurs solutions sont proposées, je pense que celui qui a posé la question, a sa réponse, et fera lui même son idée sur quelle méthode est la meilleure POUR LUI.

Débat inutile ;)
Posted on October, 29 2018 - 3:19 PM
Bien le bonjour,

Franchement déjà grand merci à vous tous pour votre aide, il y a du bon et du moins bon (je veux dire que ça ne rentre pas dans mes besoins).


Je répète ma demande initiale :
- j'ai 2 applications LANCEES (si l'application B ne l'est pas, je la lance en programmation)
- je voudrais que l'application A envoie un ordre à l'application B avec un ou plusieurs paramètres

Le But ?
Exemple :
- j'ai une gestion de logistique (application A) et une gestion de facturation (application B)
- je voudrais voir la fenêtre de la facture d'un bon de livraison
ce n'est qu'un exemple, j'ai plein plein d'autres utilisations

Donc je dois pouvoir lancer une procédure (AVEC un ou plusieurs paramètres (en fonction de la technique utilisée)) depuis l'application A vers l'application B.


J'ai testé avec le postmessage et évènement, mais je n'arrive pas à envoyer une chaine comme paramètre (ou alors je m'y prends mal -_-)
Posted on October, 29 2018 - 3:26 PM
Donc du coup, je regarde du côté des fonctions DDE.... qui semblent me correspondre, mais difficile de trouver des exemples sur l'aide :/
Posted on October, 29 2018 - 3:59 PM
Julien a écrit :
Bonjour,

(Déjà je suis en Windev 23)

Sur un même PC, j'ai 2 applications Windev qui sont lancés et développés par moi-même.

Je voudrais cliquer sur un bouton de l'application A, qui devrait exécuter une procédure de l'application B.

Comment faire svp ?

Merci d'avance.


Bonjour

Si tu expliquais un peu le contexte ( besoin récurrent, besoin de valeur de retour, est-ce que tu maitrise le code des deux applis, base de données commune... ??) je pense que ce serait plus simple de t'orienter de la meilleure manière en connaissant l'environnement et les contraintes

Car là ca part en sucette

Marc Fastré
www.marc-fastre.be
Posted on October, 29 2018 - 5:21 PM
Philippe SB a écrit :
bonjour philippe

bien sur que si ça fonctionne !

ça lance une deuxième instance de l'exe !

il faut juste pour cela dire qu'on peut avoir plusieurs instances du meme exe...


Je continue à dire que ta méthode ne fonctionne lorsque l'exe n'est pas lancé. Si je veux rafraichir la liste de l'application B, ta méthode ne fonctionne pas.

--
Cordialement,

Philippe SAINT-BERTIN



Bonjour.

je pense Philippe qu'on ne se comprend pas.

nous utilisons cette méthode tous les jours plusieurs fois par jour.

j'ai besoin de lancer une procedure (souvent un batch d'edition ) qui se trouve dans un autre exe que celui en cours
disons exe1 lance procedure de exe2..

si exe2 est deja lancé, peu importe, car le lanceappli va me lancer une autre instance de mon exe2 avec mes paramètres.

j'insiste ça marche, que l'exe soit déjà lancé ou non.

par contre là où tu as raison c'est que cela ne permet pas de piloter le 2eme exe.

par exemple je ne peux pas dire dans mon exe1 de rafraichir la liste qui serait eventuellment ouverte dans l'exe2.
non ce n'est pas le but.

le but est de lancer des batchs le plus souvent qui sont dans un autre exe.

par exemple un seul exe qui gere les editions.
tous les utilisateurs peuvent lancer cet exe avec parametres :
ex
toto de son exe1 lance exe_editions avec parametres : facture 123456
titi lui lance EN MM TEMPS exe_editions avec parametres : BL 9876

2 instances du programme exe_editions sont lancées. l'exe exe_edition lance l'edition et une fois terminé, se ferme


c'est le plus simple pour executer des procedures en batch d'un autre exe . mais pas pour piloter un autre exe, on est bien d'accord !

dans l'exemple cité :
- j'ai une gestion de logistique (application A) et une gestion de facturation (application B)
- je voudrais voir la fenêtre de la facture d'un bon de livraison
ce n'est qu'un exemple, j'ai plein plein d'autres utilisations

meme pas besoin d'avoir exe B lancé.

dans A on fait lanceappli avec en parametre par exemple le nom de la fenetre et le numero
lanceappli exeB fen_bon_livraison 12345

dans exeB

on recupere la ligne de commande et on lance la fenetre

si lignedecommande(1) <> ""
utilise(lignedecommande(1), lignedecommande(2))
fin

voilà c'est tout

mais on peut aussi utiliser des trucs plus compliques qui feront la meme chose, pas de pb pour ça.
Posted on October, 30 2018 - 9:27 AM
Bonjour

En ce qui me concerne j'utilise la technique lance appli / LigneCommande afin d'exécuter des fonctionnalités ( principalement d'impression ) intégrées dans une appli WinDev 20 depuis une WinDev 5.5 ( et oui ca fonctionne tj même sur les W10 / 64 )

Cette technique est simple et fiable, elle tourne chez 200 clients et ne pose aucun problème, si tu ne dois pas échanger des données et ques les 2 exe sont sur la même machine ce n'est pas la peine de faire plus complexe.

Bon dev

Marc Fastré
www.marc-fastre.be
Registered member
1,623 messages
Popularité : +100 (114 votes)
Posted on October, 30 2018 - 10:28 AM
Apparemment son besoin est plutôt de "piloter" l'application B a partir de la A.
"- je voudrais voir la fenêtre de la facture d'un bon de livraison"
Donc l'application A demande a la B d'ouvrir sa fenêtre de gestion des factures et afficher la facture XXXX.

Si l'application n'est pas lancée, c'est faisable mais c'est plus compliqué, il faut pouvoir gérer la connexion de l'utilisateur en automatique sur l'application B.. c'est pas très sécur.

D’où ma proposition des sockets, c'est fait pour ça et c'est utilisé dans de nombreux cas.
Prenez le cas des jeux en lignes par exemple..ça communique des dizaines de fois par secondes par ce biais et ça fonctionne très bien !

Donc A envoi une requete par socket a B qui la reçoit et réagit en fonction de ce qu'elle reçoit.
C'est pas très compliqué a mettre en place.
Registered member
309 messages
Popularité : +31 (37 votes)
Posted on October, 30 2018 - 11:10 AM
Encore une suggestion (on n'est plus à une près) :
-L'Application A peut stocker les ordres à réaliser dans un fichier (texte?) intermédiaire
-Envoyer ensuite un message à l'application B qui sait alors qu'elle doit lire et exécuter les instructions présentes dans le fichier intermédiaire...

Bon dev.
Message modified, October, 30 2018 - 11:12 AM
Registered member
69 messages
Popularité : +4 (4 votes)
Posted on October, 30 2018 - 1:22 PM
Bonjour,

Comme le postmessage ne fait pas l'affaire, il existe un autre moyen de communiquer entre application. (Je ne l'ai pas testé avec Windev mais le principe me plais).
En plus il existe un exemple livré avec Windev, WD PartageMemoire.
Le principe consiste à utiliser une zone mémoire système partagée entre application. C'est un peu plus compliquer à mettre en oeuvre que les précédentes suggestions, mais à mon avis, cela mérite d’être étudier.

Bon développement
Posted on October, 30 2018 - 2:16 PM
Bonjour,

on souhaite utiliser la fonctionnalité d'un programme A dans un programme B.

La meilleure solution à mon avis est de permettre la réutilisation de la fonctionnalité directement depuis le programme B. D'expérience, il est beaucoup plus complexe de faire fonctionner la discussion entre deux applications que d'intégrer la fonctionnalité.

Il faut bien entendu pour cela que le programme A soit parfaitement architecturé pour permettre le partage des fonctionnalités.

Et le partage se fait assez simplement au moyens des composants (interne ou externe). Le partage peut se faire en partageant l'IHM, mais il peut aussi se faire simplement sur les règles métiers. Libre à l'application B de recréer une IHM autour de la fonctionnalité récupérée de A.

Concernant les sockets, je préfère les utiliser dans un cadre client / serveur. Pour effectuer une conversation, il faut que les deux entités qui dialoguent soient disponibles. Si l'une n'est pas disponible, que se passe-t-il ? Les sockets marchent aussi lorsqu'on fait un dialogue entre client avec un système de routage (mqtt par exemple). Dans ce genre d'architecture, on peut prévoir l'absence de réponse.

Bon courage dans ce débat très intéressant techniquement :)
Registered member
81 messages
Popularité : +2 (4 votes)
Posted on November, 05 2018 - 8:57 AM
Marret a écrit :

> Le principe consiste à utiliser une zone mémoire système partagée entre application. C'est un peu plus compliquer à mettre en oeuvre que les précédentes suggestions, mais à mon avis, cela mérite d’être étudier.


bonjour,

j'ai utilisé ça pour une fenetre popup communes à 5 applications. (une sorte de todolist)

chaque clic dans cette fenêtre devait déclencher une action dans l'application qui va bien.
je passais par une zone de mémoire partagée.

ça marchais bien 90% du temps... et de temps en temps, et je n'ai jamais trouvé pourquoi , l'evement ne se declenchait pas...

mais c'était il y a un moment déjà, peut etre que ça marche mieux maintenant.
Posted on November, 21 2018 - 11:08 AM
Bonjour,


Après moultes essais, j'ai fini par choisir la méthode avec les fonctions DDE qui fonctionnent très bien dans mon cas.

En vous remerciant tous, ce fut très instructif, j'utiliserai probablement d'autres méthodes dans le futur.