Archives du mot-clé automation

Utiliser Automation depuis Scilab sur Windows (2)

Dans un précédent billet, J’ai présenté une méthode permettant de faire communiquer Scilab et différent processus sur Windows : Utiliser Automation depuis Scilab sur Windows.

Avant de pouvoir utiliser le module « ole », il faut compiler des codes C++. Malheureusement, la compilation ne fonctionne pas avec les versions récentes de Visual Studio, notamment la version 12 (2013).

Compilation du module « ole »

Les étapes de la compilation sont résumées dans mon précédent billet  : Utiliser Automation depuis Scilab sur Windows.

Compilation réussie… ou pas ?

Pour savoir si le module « ole », a bien été correctement compilé, il faut vérifier deux choses.

D’une part, un nouveau dossier « bin » doit être créé. Il contient trois fichiers :

  • automation.dll
  • automation.exp
  • automation.lib

D’autre part, des fichiers avec l’extension « .bin » ont été créés dans le sous-dossier « macros »

Si c’est bien le cas, vous pouvez maintenant charger le module dans Scilab avec :

-->exec loader.sce;

Si vous obtenez le message :

!'VCExpress.exe' n'est pas reconnu en tant que commande interne   !
!                                                                 !
!ou externe, un programme exécutable ou un fichier de commandes.  !

Consultez le billet  : Utiliser Automation depuis Scilab sur Windows.

Si aucune erreur n’apparait et que les deux conditions énumérées précédemment ne sont pas vérifiées, il va falloir chercher où se situe le problème.

Échec de la compilation

Cherchez un fichier « automation.log » dans le sous-dossier « src\Release », ouvrez-le et cherchez le mot « error ». Vous avez maintenant un début de piste…

Si ce fichier « automation.log » n’existe pas ou que l’erreur ne correspond pas à celle décrite ci-dessous, ouvrez une nouvelle discussion dans le forum Scilab.

Erreur à l’inclusion de xtgmath.h

Avec Visual Studio 2013, une erreur apparait à la compilation de sci_ole_get.cpp (entre autres) :

1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2059: syntax error : '('
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2062: type 'double' unexpected
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2059: syntax error : ')'
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2027: use of undefined type 'std::enable_if'
                 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtr1common(67) : see declaration of 'std::enable_if'
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): warning C4346: 'std::is_integral::value' : dependent name is not a type
                 prefix with 'typename' to indicate a type
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2062: type 'int' unexpected
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2146: syntax error : missing ')' before identifier '_Left'
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2146: syntax error : missing ';' before identifier '_Left'
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xtgmath.h(206): error C2143: syntax error : missing ';' before '+'

La ligne 206 de « xtgmath.h » :

_GENERIC_MATH1(round, _CRTSPECIAL)

Rien d’anormal à première vue, sauf que « round » est une macro définie précédemment dans le fichier « core_math.h » de Scilab :

#define     round(a)    (int)(((a)<0.0)?(a)-.5:(a)+.5)

scilab-visual-studio-xtgmath
Solution rapide :

  • mettre en commentaire la ligne n°206 dans le fichier « xtgmath.h ». Le fichier est en lecture seule, vous devrez donc modifier ses propriétés directement depuis l’explorateur de Windows.
  • lancer à nouveau la compilation du module « ole » depuis Scilab
  • rétablir la ligne n°206 dans le fichier « xtgmath.h »

Ce n’est certes ni la solution la plus élégante, ni la solution la plus robuste, mais elle est relativement simple à mettre en œuvre.

Conclusion

J’espère que ces deux billets de blog vous permettront d’utiliser Automation depuis Scilab.

Si, malgré les solutions proposées, vous avez toujours des problèmes de compilation du module « ole », n’hésitez pas à ouvrir une nouvelle discussion dans le forum Scilab. Pensez à joindre le fichier « automation.log » si possible.

Utiliser Automation depuis Scilab sur Windows

Automation (anciennement OLE Automation) permet la communication entre différents logiciels (processus) sur Windows. Cela permet par exemple de faire communiquer MATLAB avec Excel (voir Contrôle d’Excel par MATLAB via Automation).

Avec MATLAB, il suffit d’utiliser la fonction actxserver. Il n’y a pas de fonction équivalente fournie avec la version de base de Scilab. Il faut installer un module complémentaire « ole » qui se trouve sur la forge Scilab (What is the Forge ?).

Téléchargement du module « ole »

Le code source du module « ole » est disponible à cette adresse : http://forge.scilab.org/index.php/p/ole/

Les fichiers sources sont disponibles soit en format zip : ole-master.zip, soit via un dépôt Git avec la commande git clone git://git.forge.scilab.org/ole.git

Une fois le code source téléchargé, il faut maintenant le compiler.

Compilation du module « ole »

Vous devez tout d’abord vérifier qu’un compilateur Microsoft de la suite Visual Studio est installé. Ouvrez Scilab et exécutez la commande suivante :

-->compiler = findmsvccompiler()

Si aucun nom de compilateur n’est renvoyé, vous devez en installer un.
Par exemple : Microsoft Visual Studio 2012 Express

Une fois que vous avez un compilateur opérationnel, placez-vous dans le dossier où se trouvent les fichiers sources du module « ole » et exécutez la commande suivante :

-->exec builder.sce;

Scilab doit renvoyer :

Création des macros...
-- Création de [automationlib] (Macros) --
genlib : Traitement du fichier : %VARIANT_e.sci
genlib : Traitement du fichier : %VARIANT_p.sci
genlib : Traitement du fichier : %VARIANT_size.sci
genlib : Traitement du fichier : %ptr_p.sci
genlib : Traitement du fichier : ole_getOlePath.sci
genlib : Régénère les noms et les bibliothèques

Il est maintenant possible de charger le module dans Scilab :

-->exec loader.sce;
Start Automation for Scilab
    Load gateways
    Load macros

Vous pouvez maintenant utiliser la fonction ole_actxserver (comme la fonction MATLAB actxserver). Par exemple pour interfacer Scilab avec Excel :

Excel = ole_actxserver("Excel.Application")

Vous trouverez différents tests dans le fichier « examples.sce ». Tous ne fonctionneront peut être pas en fonction des éléments de Windows installés ou non sur votre machine. N’exécutez donc pas le script en entier, mais faîtes plutôt des copier/coller des blocs de code susceptibles de fonctionner.

Erreur « ‘VCExpress.exe’ n’est pas reconnu… » avec Visual Studio 2012 Express

A la compilation avec Visual Studio 2012 Express, Scilab renvoi le message suivant :

!'VCExpress.exe' n'est pas reconnu en tant que commande interne   !
!                                                                 !
!ou externe, un programme exécutable ou un fichier de commandes.  !

Depuis la version 2012, l’exécutable ne se nomme plus « VCExpress » mais « WDExpress ». Ouvrez le fichier « builder.sce » et modifiez le bloc suivant :

    compiler = findmsvccompiler();
    if strstr(compiler, "express")  "" then
        compilerbin = "VCExpress.exe ";
    else
        compilerbin = "devenv.exe ";
    end

en

    compiler = findmsvccompiler();
    if strstr(compiler, "express")  "" then
        compilerbin = "WDExpress.exe ";
    else
        compilerbin = "devenv.exe ";
    end

Exécutez à nouveau « builder.sce »

Conclusion

Voila, vous pouvez maintenant faire appel à automation depuis Scilab pour communiquer entre différents processus Windows.

Et vous ?

  • Avez-vous déjà utilisé Automation avec Scilab ?
  • Dans quel but ?
  • Avez-vous rencontré des problèmes ?