Lancer process externe

4D 2004 introduit LANCER PROCESS EXTERNE, une commande assez similaire aux deux commandes AP ShellExecute et AP Sublaunch issues du plugin 4D Pack. Cependant LANCER PROCESS EXTERNE est beaucoup plus évoluée et plus puissante. Elle permet, en plus d'ouvrir des documents ou applications, de récupérer des résultats. La base de démonstration vous fournit plusieurs exemples tant sur Mac que sur Windows.

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

LANCER PROCESS EXTERNE est une des nombreuses nouveautés que comporte 4D 2004. LANCER PROCESS EXTERNE est une évolution de deux commandes issues du plugin 4D Pack : AP ShellExecute et AP Sublaunch.

Si, dans vos bases actuelles, vous utilisez AP ShellExecute et AP Sublaunch pour lancer des applications tierces ou que tout simplement vous souhaitiez recourir aux services de PERL, PHP ou toutes autres applications scriptables, alors LANCER PROCESS EXTERNE est LA solution.

Cette note technique est accompagnée d'une base de démonstration illustrant deux propriétés importantes de la commande :

- La capacité de retourner des résultats de script (PERL, PHP, VBScript, commandes Unix...)

- La capacité de lancer une application Mac ou Windows et de la faire tourner indépendamment de 4D.

Note :
pour plus d'informations sur l'usage de LANCER PROCESS EXTERNE, vous pouvez consulter la documentation de la mise à jour 2004 ou http://4d.developpez.com/documentation/4DDoc2004/CMF/CMF00811.HTM .

II. Le point sur AP Sublaunch

AP Sublaunch permet de lancer une application ou encore d'ouvrir un document depuis 4D.

Sur une machine équipée de Windows, il est possible de contrôler le lancement de l'application dans une fenêtre classique, en plein écran ou minimisée dans la barre des tâches. Utiliser AP Sublaunch revient à faire un double-clic sur un exécutable. Il est possible de passer en paramètres le nom des documents à ouvrir.

Sur Macintosh cette commande équivaut à un double-clic sur l'icône d'une application. Un code d'erreur est retourné vous indiquant le résultat en erreur ou non.


Voici la syntaxe :

AP Sublaunch (nomFichier; mode) ->Entier long

Paramètre Type Description
nomFichier Alpha Nom du fichier ou du document à exécuter
mode Numérique Etat de la fenêtre au lancement (Windows)
    Lancement synchrone (MacOS)
Résultat Entier long Code d'erreur



Documentation :

http://4d.developpez.com/documentation/4DDoc2004/CMF/CMF61989.HTM


Exemple sur Windows :

C_TEXTE($fichier;$app)  
C_ENTIER LONG($err)
    $fichier:="C\Documents and sttings\Database_test\testPDF\pub71.pdf"
    $app:="C\Program files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe"
    $err:= AP Sublaunch ($app+" "+$fichier;0))


Exemple sur Macintosh :

C_ENTIER LONG($err)
    $err:= AP Sublaunch ("HD:Dossier:appli";0)

III. Le point sur AP ShellExecute

AP ShellExecute permet de lancer une application ou encore d'ouvrir un document depuis 4D. La commande est optimisée pour Windows avec l'usage du troisième paramètre.

Sur Windows, vous passez le chemin d'accès à un fichier et Microsoft se charge de trouver l'application associée. Tout comme avec AP Sublaunch, vous contrôlez le lancement dans une fenêtre normale, plein écran ou minimisée dans la barre de tâches. Le dernier paramètre, optionnel, permet de passer des informations supplémentaires pour lancer l'application. Vous utilisez cette commande pour piloter un navigateur web, passez un URL en paramètre. Notez que cela est spécifique aux PC, sur Mac l'URL serait ignoré.

Sur Mac, vous passez un chemin d'accès à un fichier et l'application associée sera automatiquement trouvée si elle existe. Sinon un code d'erreur est retourné.


Voici la syntaxe :

AP ShellExecute (nomFichier{; mode{; param}})->Entier long

Paramètre Type Description
nomFichier Chaîne Nom du fichier ou du document à exécuter
mode Entier long Etat de la fenêtre à l'ouverture (Windows)
    Ouverture synchrone (MacOS)
param Texte Paramètres de l'application (Windows)
Résultat Entier long 0 si l'exécution de la commande est correcte, sinon code d'erreur



Documentation :

http://www.4d.fr/documentation/4Ddoc2004/CMF/CMF61957.HTM


Exemples :

      $err:=AP ShellExecute (Fichier{;mode{;param}})

C_ENTIER LONG($err)
C_TEXTE($file;$T_LineParam)
      $line:="look32.exe"
      $T_LineParam:="mode:line -resppi:100 -fmt:bmp -selmm:1:2:206:293 -optim:speed"
      $err:=AP ShellExecute ($line;0;$T_LineParam)

C_ENTIER LONG($err)
C_TEXTE($file)
      $file:="Pub71.pdf"
      $err:=AP ShellExecute($file)


En conclusion, ces commandes permettent de lancer une application externe. Cependant, seulement AP ShellExecute permet de lancer une application en ne passant que le nom de fichier à ouvrir. Disons que AP ShellExecute est une version optimisée de AP Sublaunch.

IV. Le point sur LANCER PROCESS EXTERNE

LANCER PROCESS EXTERNE permet de lancer un process externe de 4D sous MacOS X et sous Windows.

Sous Windows, LANCER PROCESS EXTERNE est comme AP ShellExecute, avec des capacités en plus.

Sous MacOS X, tout ce qui peut être lancé depuis le terminal peut être lancé par LANCER PROCESS EXTERNE.


En premier paramètre de LANCER PROCESS EXTERNE, passez le chemin d'accès à l'application et vous ouvrez l'application.

LANCER PROCESS EXTERNE ("C:\\Windows\\notepad.exe")


Vous pouvez aussi décider de désigner un fichier à ouvrir dans ce premier paramètre.

LANCER PROCESS EXTERNE (“Applications/TextEdit.app/Contents/MacOS/TextEdit file.txt")


Les deuxième, troisième et quatrième paramètres sont optionnels. Le second paramètre est le flux d'entrée qui contient le standard in (stdin) du process externe. Ce flux d'entrée peut être utilisé pour passer des variables à l'application à lancer. Un script PHP peut être lancé avec toute une liste de valeurs. L'appel au script sera le premier paramètre et les paramètres de ce script seront passés avec le flux d'entrée, avec le second paramètre de LANCER PROCESS EXTERNE.


Dès que la commande a été exécutée, le flux de sortie et, si vous les avez passés, les paramètres d'erreur retournent respectivement le standard out (sdtout) et le standard error (sdterr) du process externe. 4D utilise ces résultats pour les accepter ou les refuser. Dans le code ci-après $cmd représente l'application à lancer, $in est le standard input, $out le standard output et enfin $error est le standard error.

LANCER PROCESS EXTERNE($cmd;$in;$out;$error)


Si nous revenons à notre exemple en PHP, lorsque le script est utilisé et qu'il se termine, le résultat est placé dans le troisième paramètre, le standard out (stdout). Si l'exécution dans PHP retourne une erreur, le quatrième paramètre, le standard error (stderr) est renseigné.

LANCER PROCESS EXTERNE(fileName{; inputStream{; outputStream{;errorStream}}})


En cas d'exécution correcte, plutôt que de retourner une valeur, LANCER PROCESS EXTERNE met la variable système OK à 1. Une erreur rencontrée (fichier non trouvé, mémoire insuffisante...) mettrait OK à 0.

V. Lancer des applications externes avec LANCER PROCESS EXTERNE

La base exemple associée à cette Note technique vous permet de jouer avec LANCER PROCESS EXTERNE en ouvrant quelques applications sur chaque OS.

L'interface Macintosh :

Pictures 0605x0294




L'interface Windows :

Pictures 0605x0278




En cliquant sur un des boutons de lancement en haut, un nouveau process est créé pour lancer l'application choisie. Il est nécessaire de créer ce process car nous ne voulons pas que ce soit le process principal qui pilote l'application externe. Ce nouveau process est utilisé pour exécuter la méthode projet LPE_Play_Apps (LPE pour Lancer Process Externe). Le process durera tant que l'application n'a pas quitté. Durant ce temps, le process 4D est suspendu au niveau de la ligne de code qui exécute LANCER PROCESS EXTERNE. Quand l'application externe a terminé, des valeurs sont retournées à 4D qui exécute la ligne de code suivante. C'est pourquoi il est très important que la méthode d'appel ait son propre process.


Voici un exemple de code placé dans un bouton :

C_ENTIER LONG($proc)
      $proc:=Nouveau process("LPE_Play_Apps";32*1024;"Application:iChat";"iChat";*)


...et la méthode LPE_Play :

C_TEXTE($app;$1)
C_TEXTE($cmd)
      $app:=$1

Au cas ou

         : ($app="iCal")
            $cmd:="/Applications/iCal.app/Contents/MacOS/iCal"

         : ($app="iTunes")
            $cmd:="/Applications/iTunes.app/Contents/MacOS/iTunes"

         : ($app="iChat")
            $cmd:="/Applications/iChat.app/Contents/MacOS/iChat"

         : ($app="TextEdit")
C_TEXTE($2;$file)
            $file:=$2
            $cmd:="/Applications/TextEdit.app/Contents/MacOS/TextEdit "+$file

         : ($app="Calc")
            $cmd:="c:\\Windows\\system32\\calc.exe"

         : ($app="WMP")
            $cmd:="C:\\Program Files\\Windows Media Player\\wmplayer.exe"

         : ($app="CMD")
            $cmd:="c:\\Windows\\system32\\cmd.exe"

         : ($app="Notepad")
C_TEXTE($2;$file)
            $file:=$2
            $cmd:="c:\\Windows\\Notepad.exe "+$file

Fin de cas

LANCER PROCESS EXTERNE($cmd)


Comme vous le constatez, sur MacOS X, il convient de passer un chemin d'accès complet et non pas un chemin d'accès au package. Cela vaut également pour Windows. À l'exception de Notepad et de TextEdit où on ne passe pas de second paramètre.

VI. Récupérer des informations en retour

Qui n'a pas rêvé de faire des applications qui feraient faire des calculs «ailleurs» et de récupérer le résultat dans 4D ? De compliqué dans le passé, ceci est devenu simple en version 2004 avec LANCER PROCESS EXTERNE.


Voici comment procéder avec l'exemple de la méthode LPE_Play.

C_TEXTE($1;$cmd)
C_TEXTE($error)
C_TEXTE($0;$out)

      $cmd:=$1

Si (Nombre de parametres=2)
C_TEXTE($2;$in)
         $in:=$2
Sinon
C_TEXTE($in)
Fin de si

LANCER PROCESS EXTERNE($cmd;$in;$out;$error)

Si (OK=1)
Si ($out="")
            $0:=$error+
Caractere(13)+
Caractere(10)+$out
Sinon
            $0:=$out
Fin de si
Sinon
         $0:=$error+
Caractere(13)+
Caractere(10)+$out
Fin de si


Dans l'exemple, la méthode LPE_Play est appelée pour exécuter un fichier .bat sur un PC. La combo box contient une liste de scripts à réaliser : quelques fichiers .bat, un VBScript pour Windows, des commandes Unix, des cgi PERL et PHP sur MacOS X. Les chemins d'accès sont passés en premier paramètre de LANCER PROCESS EXTERNE et le stdout et le stderr sont en troisième et quatrième. Le second paramètre n'est pas utilisé mais est quand même passé.

Pictures 0604x0468


Après que les scripts demandés ont été exécutés, le flux de sortie (stdout) retourne le résultat du fichier .bat dans 4D qui peut afficher ou traiter ces données. Comme vous l'avez noté, l'appel à LANCER PROCESS EXTERNE ne se fait pas dans son propre process mais d'un process maître. C'est parce que nous devons attendre la fin du script et le retour d'information avant d'aller plus loin.

VII. Complément de Lancer process externe

FIXER VARIABLE ENVIRONNEMENT est une autre commande qui fait son apparition avec 4D 2004. Son nom est explicite : il permet de spécifier une variable d'environnement et sa valeur. La force de la commande est cette capacité de créer et renseigner des variables dans le script externe que vous êtes sur le point d'exécuter.


Voici l'exemple du fichier batchtest.bat :

      :: This batch file displays environment variables sent from 4D via the
      :: Set Environment Variable command

      Echo Name of Machine: %Machine_Name%
      Echo Owner of Machine: %Machine_Owner%
      Echo Temporary Folder: %Temporary_Folder%
      Echo Active 4D Folder: %Active_4D_Folder%
      Echo System Folder: %System%
      Echo User Profile: %Profile%
      Echo Structure File: %Structure_File%
      Echo Data File: %Data_File%
      Echo Compiled?: %Compiled_APP%
      Echo Location of 4D's Executable: %Location_Of_4D%
      Echo Machine IP address: %IP_Address%
      Echo Default Web Port: %Default_Web_Port%


Les variables Système sont reconnaissables à leurs %variable%. Le résultat est affiché dans la copie d'écran plus haut. Ces variables ont été renseignées par FIXER VARIABLE ENVIRONNEMENT de la méthode LPE_set_ENV_Var :

FIXER VARIABLE ENVIRONNEMENT("Machine_Name";Nom de la machine)
FIXER VARIABLE ENVIRONNEMENT("Machine_Owner";Nom du possesseur)
FIXER VARIABLE ENVIRONNEMENT("Temporary_Folder";Dossier temporaire)
FIXER VARIABLE ENVIRONNEMENT("Active_4D_Folder";Dossier 4D)
FIXER VARIABLE ENVIRONNEMENT("System";Dossier systeme(Système))
FIXER VARIABLE ENVIRONNEMENT("Profile";Dossier systeme(Préférences ou Profiles))
FIXER VARIABLE ENVIRONNEMENT("Structure_File";Fichier structure)
FIXER VARIABLE ENVIRONNEMENT("Data_File";Fichier donnees)
FIXER VARIABLE ENVIRONNEMENT("Compiled_APP";Chaine(Num(Application compilee);"True;;False"))
FIXER VARIABLE ENVIRONNEMENT("Location_Of_4D";Fichier application)
FIXER VARIABLE ENVIRONNEMENT("IP_Address";LPE_Get_IP )
FIXER VARIABLE ENVIRONNEMENT("Default_Web_Port";Chaine(Lire parametre base(Numéro du port)))


À chaque fois que cette commande est invoquée, une nouvelle variable est créée. Quand 4D rencontre LANCER PROCESS EXTERNE les variables créées sont liées à l'environnement de l'application : on créé ainsi des variables dans une application que nous allons appeler !

A noter :

Dans la version 4D 2004.1, deux nouvelles options seront ajoutées pour permettre de mieux contrôler la commande LANCER PROCESS EXTERNE :
   - 1ère option : possibilité de changer le répertoire courant dans le process lancé. Ceci peut être utile par exemple pour lancer des scripts faisant référence à des chemins relatifs.
   - 2ème option (Windows uniquement) : permet de cacher la console DOS qui parfois apparaît inopinément au lancement de certaines commandes. Il ne faut pas utiliser cette option systématiquement car alors certaines applications ne se lanceraient pas (par exemple Notepad). Cette option sera à FAUX par défaut dans la version finale.

Exemple :
FIXER VARIABLE ENVIRONNEMENT ("_4D_OPTION_CURRENT_DIRECTORY";"c:\\mypath")
FIXER VARIABLE ENVIRONNEMENT("_4D_OPTION_HIDE_CONSOLE";"true")
LANCER PROCESS EXTERNE($whatevercommand) 

VIII. Conclusion

4D 2004 introduit LANCER PROCESS EXTERNE, une commande assez similaire aux deux commandes AP ShellExecute et AP Sublaunch issues du plugin 4D Pack. Cependant LANCER PROCESS EXTERNE est beaucoup plus évoluée et plus puissante. Elle permet, en plus d'ouvrir des documents ou applications, de récupérer des résultats. La base exemple vous fournit plusieurs exemples tant sur Mac que sur Windows. Afin d'en tirer tout le profit, testez-la sur les deux environnements.

IX. Base exemple

Téléchargez la base exemple :

Base exemple

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.