[RESOLU] Envoi de paramètres d'un *.exe à un autre *. exe ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

[RESOLU] Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

Bonjour,

Il semblerait qu'il soit possible d'envoyer des paramètres d'un programme principal à un autre pour son exécution par la cde RunProgram() avec paramètres.
Malgré les explications de la doc. en ligne, je n'arrive pas à comprendre le principe de fonctionnement de l'envoi et la réception.

Je souhaiterai envoyer au lancement d'un programme auxiliaire (aux.exe) piloter par un programme principal (princ.exe) des informations comme :
"LFMT", "1", "oui" qui seraient lues et interpréter par le programme receveur.

- De quelle manière envoyer ces "instructions" depuis princ.exe ?
- Quelle est la méthode pour que le prg receveur (aux.exe) utilise ces données lors de son lancement ?

Merci pour vos éclaircissements.
Dernière modification par PhM le mer. 12/févr./2020 6:33, modifié 1 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par microdevweb »

Bonjour avec SetEnvironmentVariable et GetEnvironmentVariable

exemple receiver

Code : Tout sélectionner

Define a.s 
 a = GetEnvironmentVariable("a")
 

If Len(a)
  MessageRequester("PRG1","a = "+a)
Else
  MessageRequester("PRG1","a was no seted")
EndIf  
exemple sender

Code : Tout sélectionner

SetEnvironmentVariable("a","hello world")
RunProgram("prg1.exe")
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par Marc56 »

Programme émetteur:
Tous les paramètres dans le champs 2 et par défaut séparés par un espace

Code : Tout sélectionner

RunProgram("princ.exe", "LFMT 1 oui", "")
Programme récepteur:
CountProgramParameters() et ProgramParameter(i)
Premier paramètre 0

Code : Tout sélectionner

For i = 0 To CountProgramParameters()
    Debug ProgramParameter(i)
Next
Cela permet aussi de traiter les fichiers reçus sur l'icône du programme lors d'un drag and drop

C'est comme en C: nombre de paramètres et tableau des paramètres, sauf qu'en PB il n'y a pas besoin de le préciser.

Code : Tout sélectionner

int main(int argc, char *argv[]);
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

Bonjour et merci pour vos réponses "éclairs"...
Je teste cela et je vous tiens au courant !
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

Bon, pour le moment, cela ne fonctionne pas trop !

Voici mes lignes de commandes :

Programme émetteur :

Code : Tout sélectionner

iaco$  = "LFKC"
avion$ = "Takeoff"

RunProgram("PHM\OACI\Fiche_airport.exe", iaco$ + " " + avion$, "")
ou, qui ne fonctionne pas mieux !

Code : Tout sélectionner

ID1 = RunProgram("PHM\OACI\Fiche_airport.exe", "LFKC Takeoff" , "")
Programme récepteur (Fiche_airport.exe) :

Code : Tout sélectionner

;Premières lignes du programme récepteur

    For i = 0 To CountProgramParameters()
      Debug ProgramParameter(i)
    Next
    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)
Le programme récepteur s'ouvre mais, il est visible que les paramètres n'ont pas été reçus ?
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

Cela évolu !
Les paramètres sont bien reçus, j'ai vérifier sur le programme récepteur en ajoutant :

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)

    If OpenConsole()
      PrintN("Code airport : " + iaco$)
      PrintN("Code Avion   : " + avion$ + ".png")
      Delay(8000) 
      CloseConsole()
    EndIf
    
    avion$ = avion$ + ".png"
    
    ;avion$ = "Takeoff.png"
    ;iaco$  = "LFKC"
Mais, le programme ne prends pas en compte les deux variables reçues alors, qu'en enlevant les 2 point-virgules ensuite, cela fonctionne normalement :?:
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par Marc56 »

Mais, le programme ne prends pas en compte les deux variables reçues alors, qu'en enlevant les 2 point-virgules ensuite, cela fonctionne normalement
Je ne comprends pas bien.
Il manque le reste du programme, mais je suppose que tu sais que ce qui est après une commande Debug est ignoré une fois compilé en EXE donc préférer MessageRequester() plutôt qu'un éventuel Debug avions$ qui n'affichera rien.

Donc

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)

;     If OpenConsole()
;       PrintN("Code airport : " + iaco$)
;       PrintN("Code Avion   : " + avion$ + ".png")
;       Delay(1000)
;       CloseConsole()
;     EndIf
    
    MessageRequester("", iaco$ + #CRLF$ + avion$)
    
    avion$ = avion$ + ".png"
   
    ;avion$ = "Takeoff.png"
    ;iaco$  = "LFKC"
    
    MessageRequester("", avion$ + #CRLF$ + iaco$)

Code : Tout sélectionner

---------------------------

---------------------------
Takeoff.png

LFKC
---------------------------
OK   
---------------------------
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

C'est complètement fou ???

Le reste du programme ne devrait pas te donner beaucoup d'informations sachant que :

Cela fonctionne comme cela :

Code : Tout sélectionner

    ;iaco$  = ProgramParameter(0)
    ;avion$ = ProgramParameter(1)
    ;avion$ = avion$ + ".png"

    MessageRequester("", iaco$ + #CRLF$ + avion$)
      
    avion$ = "Takeoff.png"
    iaco$  = "LFBT"
Cela ne fonctionne plus comme cela :

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)
    avion$ = avion$ + ".png"

    MessageRequester("", iaco$ + #CRLF$ + avion$)
      
    ;avion$ = "Takeoff.png"
    ;iaco$  = "LFBT"
Et, cela ne fonctionne plus comme cela : :?: :?: :?: :?: :?:

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)
    avion$ = avion$ + ".png"

    MessageRequester("", iaco$ + #CRLF$ + avion$)
      
    avion$ = "Takeoff.png"
    iaco$  = "LFBT"
Alors, que j'écrase les variables reçues !
Et, dans ce dernier cas, je visualise aussi les variables en entrée.

J'ai aussi tenté de modifier les variables envoyées, sans plus de succès :

Code : Tout sélectionner

    SENDiaco$  = ProgramParameter(0)
    SENDavion$ = ProgramParameter(1)
    avion$ = SENDavion$ + ".png"

    MessageRequester("", SENDiaco$ + #CRLF$ + SENDavion$)
      
    avion$ = SENDavion$
    iaco$  = SENDiaco$
Je pense que je vais passer par un fichier *.ini depuis l'émetteur pour l'exploiter par le récepteur sans problème. Mais c'est dommage quand même...
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par Marc56 »

Tu peux tester dans l'IDE la réception de paramètres comme s'ils avaient été envoyés par un autre programme, ça simplifie de dév:

Compilateur >
Options du Compilateur >
Compiler/Exécuter >
Paramètres de l'exécutable >
et là tu mets les paramètres séparés par un espace
Takeoff LFBT

Ton code

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)
    avion$ = avion$ + ".png"

    MessageRequester("", iaco$ + #CRLF$ + avion$)
Affiche bien

Code : Tout sélectionner

---------------------------
Takeoff
LFBT.png
---------------------------
OK   
---------------------------
Dans tes exemples tu ne fais pas d'affichage final

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)
    avion$ = avion$ + ".png"
    
    ; N'affiche que .png si aucun paramètre n'est passé (normal)
    MessageRequester("", iaco$ + #CRLF$ + avion$)
     
    avion$ = "Takeoff.png"
    iaco$  = "LFBT"
    
    ; Ne pas oublier de réafficher...
    ; Affichera bien les deux chaines puisque réatualisées
    MessageRequester("", iaco$ + #CRLF$ + avion$)
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

Cela ne change rien. Dans les deux cas ci-dessous, les deux messages s'affichent correctement mais :
Dans ce premier cas, cela ne fonctionne pas :

Code : Tout sélectionner

    iaco$  = ProgramParameter(0)
    avion$ = ProgramParameter(1)
    avion$ = avion$ + ".png" 
         
    MessageRequester("", iaco$ + #CRLF$ + avion$)
    
    avion$ = "Takeoff.png"
    iaco$  = "LFBT"
     
    MessageRequester("", iaco$ + #CRLF$ + avion$)
dans celui-ci, cela ne fonctionne toujours pas avec le premier message vide, évidement et le deuxième rempli :

Code : Tout sélectionner

    ;iaco$  = ProgramParameter(0)
    ;avion$ = ProgramParameter(1)
    ;avion$ = avion$ + ".png" 
         
    MessageRequester("", iaco$ + #CRLF$ + avion$)
    
    avion$ = "Takeoff.png"
    iaco$  = "LFBT"
     
    MessageRequester("", iaco$ + #CRLF$ + avion$)
On dirait que le fait de recevoir les données de l'émetteur annule la valeur des variables avion$ et iaco$.
Ce dernier exemple, par contre, fonctionne lorsque je lance directement ce programme récepteur sans l'appel précédent de l'émetteur !
Pour rappel, l'émetteur envoi cela :

Code : Tout sélectionner

avion$ = "Takeoff"
ID1 = RunProgram("PHM\OACI\Fiche_airport.exe", iaco$ + " " + avion$, "")
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par case »

Salut :)

a compiler en "params.exe"

Code : Tout sélectionner


OpenConsole("")
a=CountProgramParameters()
If a 
  For param=1 To a
    PrintN( ProgramParameter()  )
  Next  
  
Else
  PrintN("no params")
  
EndIf
Input()

a sauvegarder et executer dans le meme dossier que params.exe

Code : Tout sélectionner

RunProgram("params.exe","/test /lol test "+Chr(34)+"ceci est un texte contenant des espaces"+Chr(34),"")
ImageImage
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: Envoi de paramètres d'un *.exe à un autre *. exe ?

Message par PhM »

Bonjour,
J'ai trouvé ( :P ) !
Depuis le départ, la méthode de Marc est correct mais, c'est Case qui m'a mis sur la piste :

Il faut que les programmes émetteur des paramètres et récepteur des paramètres soient dans le même dossier.

Et, ce n'était pas le cas hier !
Pourtant, les chemins étaient indiqués et le récepteur recevait bien les paramètres, mais cela ne suffit donc pas !
Une fois déplacé, tout fonctionne normalement.

Merci à tous pour votre aide

L'émetteur envoie cela :

Code : Tout sélectionner

iaco$  = "LFMT"
avion$ = "Takeoff"
RunProgram("Fiche.exe", iaco$ + " " + avion$, "")
Et, le récepteur (Fiche.exe) reçoit et traite cela (dans le même dossier):
iaco$ = ProgramParameter(0)
avion$ = ProgramParameter(1)
avion$ = avion$ + ".png"
Sans avoir recours à : MessageRequester("", iaco$ + #CRLF$ + avion$)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU] Envoi de paramètres d'un *.exe à un autre *. ex

Message par Marc56 »

Depuis le départ, la méthode de Marc est correcte
Sauf mention contraire, je teste toujours ce que je poste :wink:
Il faut que les programmes émetteur des paramètres et récepteur des paramètres soient dans le même dossier.
Non (heureusement, car ça limiterait les possibilités)
Simplement si le programme qui reçoit les données est dans un répertoire différent de celui qui les envoie, il faut mettre le chemin complet.
Ex:

Code : Tout sélectionner

iaco$  = "LFMT"
avion$ = "Takeoff"
RunProgram("c:\tmp\Fiche.exe", iaco$ + " " + avion$, "")
Les paramètres sont passés dans des variable d'environnement donc le chemin n'a pas d'importance.
Ton premier exemple
RunProgram("PHM\OACI\Fiche_airport.exe"
utilisait un chemin relatif (pas de lecteur) et non pas absolu.
Sans avoir recours à : MessageRequester("", iaco$ + #CRLF$ + avion$)
Ça c'est simplement pour afficher le résultat dans l'exemple de code.
MessageRequester à la place de Debug, car le programme Fiche.exe étant compilé, les commandes Debug sont ignorées.

:wink:
Répondre