IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Appel direct d'une DLL Fortran dans une macro


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 2
    Par défaut Appel direct d'une DLL Fortran dans une macro
    Bonjour,

    Je suis tout nouveau sur ce site. Je souhaite actuellement créer des dll fortran pour les utiliser directement dans une macro vba excel.

    Pour cela, je test une application simple. J'ai donc crée une subroutine fortran f90 par l'intermédiaire de PHOTRAN (Via cygwin):

    Code fortran : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ------ex.f90---------
    SUBROUTINE increm(i)
    IMPLICIT NONE
    INTEGER*4 i
    i=i+1
    RETURN
    END
    ---------------------

    Je compile ce fichier fortran avec le compilateur mingw32-make.exe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ------ Makefile -------------------------
    all: EX.DLL
     
    ex.o: ex.f90
    	g95 -c ex.f90
     
    EX.DLL: ex.o
    	g95 -shared -mrtd -o EX.DLL ex.o
     
    clean:
    	rm -i ex.o
    ----------------------------------------
    Le Makefile permet entre autre de créer un fichier EX.DLL comprenant la subroutine increm.

    En plus de ce fichier EX.DLL, j'a creé un fichier .DEF:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ---------EX.DEF---------------------------------------
          ; EX.DEF - Module Definition file for ex.f90
          ;
          LIBRARY            EX
          DESCRIPTION     'Sample FORTRAN DLL'
          EXETYPE           WINDOWS 3.0
          CODE               PRELOAD MOVEABLE DISCARDABLE
          DATA               PRELOAD MOVEABLE SINGLE
          HEAPSIZE         1024
          EXPORTS          increm
                                WEP
    --------------------------------------------------------
    La compilation sous PHOTRAN s'effectue normalement et le dll est crée.

    Dans Micorsoft Visual basic, j'ai créé les sub suivantes pour tester la dll EX.DLL:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    '------------------------------------------------------------------------
    Private Declare Sub increm Lib "D:\Essai_dll\essai\EX.DLL" (ByVal d As Long)
     
    Private Sub CommandButton1_Click()
     
        Dim utilisateur, bonjour As String
        utilisateur = Environ("username")
        bonjour = MsgBox(prompt:="Utilisateur " & utilisateur & ", voulez vous lancer le programme?", Title:="Ma 1ere boite de dialogue")
        TextBox1.Text = "10"
        Dim lngTest As Long
        lngTest = 10
        Call increm(lngTest)
     
    End Sub
     
    Private Sub CommandButton2_Click()
     
        Unload Me
     
    End Sub
     
    '-------------------------------------------------------------
    La compilation s'effectue normalement, mais j'ai des problèmes lors de l'exécution:

    ---- Message d'erreur ------------------------
    Erreur d'exécution '453'

    Point d'entrée increm d'une dll introuvable dans:

    D:\Essai_dll\essai\EX.DLL
    ---------------------------------------------
    Il trouve la dll EX.DLL dans l'emplacement spécifié mais ne reconnait pas la subroutine increm. Les variables d'environnement ont bien été implémentées.

    Pas simple cette affaire..........!!!!

    Pourriez vous me donner des indications si vous avez déjà eu des problèmes semblables...?

    Merci,

    Papiotte

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,
    la variable ne doit elle pas etre passée par reference?
    toutes tes variables sont elles bien déclarées ?
    Private Declare Sub increm Lib "D:\Essai_dll\essai\EX.DLL" (ByVal d As Long)'byref d.....

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 2
    Par défaut Toujours un soucis
    Ca ne fonctionne toujours pas........

    Pour le petit exemple d'appel de dll fortran sous VBA, j'ai modifié le code fortran:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    --------ex.f90----------------
    SUBROUTINE increm(i,o)
    IMPLICIT NONE
    INTEGER*4, INTENT (IN) :: i
    INTEGER*4, INTENT (OUT) :: o
    o=i+1
    END
    ------------------------------
    Le Makefile est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    --------Makefile-------------------
    all: EX.DLL EX.def
     
    ex.o: ex.f90
    	g95 -c ex.f90
     
    EX.DLL: ex.o
     
    	g95 -shared -mrtd -o EX.DLL ex.o
     
    EX.def: ex.o
     
    	dlltool -z EX.def --export-all-symbols ex.o
     
    clean:
    	rm -i ex.o EX.DLL EX.def
    -----------------------------------------
    Ca compile nickel sous Photran (Eclipse), le fichier EX.dll et EX.def sont bien crées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ----------EX.def-------------------------
    ; dlltool -z EX.def --export-all-symbols ex.o
    EXPORTS
    	increm_ @ 1
    -----------------------------------------
    Voila, la fonction à utiliser est increm_(...). Sous vba, voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Private Declare Sub increm_ Lib "D:\Essai_dll\essai\EX.DLL" (ByVal a As Long, ByVal b As Long)
     
    Private Sub CommandButton1_Click()
     
        Dim utilisateur, bonjour As String
        Dim lngTest As Long
        Dim outTest As Long
     
        utilisateur = Environ("username")
        bonjour = MsgBox(prompt:="Utilisateur " & utilisateur & ", voulez vous lancer le programme?", Title:="Ma 1ere boite de dialogue")
        TextBox1.Text = "10"
     
        lngTest = 10
        Call increm_(lngTest, outTest)
     
    End Sub
    La fonction est reconnu par l'appel mais un message d'erreur apparait:

    l'instruction à "0x02..." emploi l'adresse mémoire "0x0..." La mémoire ne peut etre "read".

    Si je passe les variables par référence, j'obtiens un autre message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private Declare Sub increm_ Lib "D:\Essai_dll\essai\EX.DLL" (ByRef a As Long, ByRef b As Long)
    Erreur d'exécution '49'
    Convention d'appel de dll incorrecte

    Avez vous d'autres idées????

    Merci, Papiotte

Discussions similaires

  1. Appeler une fonction présente dans une dll
    Par beni34 dans le forum Delphi .NET
    Réponses: 6
    Dernier message: 05/09/2011, 17h08
  2. Réponses: 4
    Dernier message: 24/08/2011, 18h23
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Réponses: 4
    Dernier message: 16/05/2006, 23h15
  5. Réponses: 12
    Dernier message: 12/05/2006, 09h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo