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

Fortran Discussion :

Common block et DLL


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 4
    Par défaut Common block et DLL
    Je voudrais partager un common block entre un programme principal et une DLL . la routine de mon program principal qui utilise la DLL est :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    subroutine test
        use user32
        use kernel32
        implicit none
        pointer (p_seta, seta)
        integer(HANDLE) :: dll_handle
        integer(BOOL) :: free_status
        integer i
        real AP
        common /X/C,B,A
        real  C,B,A
        Interface 
           subroutine  Seta
                 !DEC$ ATTRIBUTES DLLIMPORT:: Seta, /X/ 
                 implicit none 
                common /X/C,B,A
                real  C,B,A
           end subroutine  Seta
       end  interface
       !==========================================!
       dll_handle = LoadLibrary ("DLL_a.dll"C)
     
       if (dll_handle == NULL) then
         ! Echec
         stop
       end if
       p_seta = GetProcAddress (dll_handle, "Seta"C)
      if (p_Seta == NULL) then
       ! Echec
        stop
      end if
      ! appelle la fonction  seta 
       call  seta       ! la  valeur de A  dans la  DLL est  1
       Ap=A            ! la  valeur de A  dans  la subroutine test  est 0  
     
    free_status = freelibrary(p_seta)
    end subroutine Test
    Quant à la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    subroutine Seta    
        use user32
        use kernel32
            !DEC$ ATTRIBUTES STDCALL, REFERENCE,ALIAS :"Seta":: Seta
            !DEC$ ATTRIBUTES DLLEXPORT:: Seta, /X/ 
            implicit none 
            common /X/C,B,A
            real  C,B,A
            A=A+1
            B=B+1
            return
    end subroutine Seta
    Le problème c'est que le common block de la routine Test n'interface pas avec le common block de la routine Seta de la DLL.

    Si vous avez une solution ou un exemple de partage de données entre un DLL et le programme appellant voulez vous bien me l'envoyer.
    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Je ne sais pas si on peut vraiment dire au common de la DLL d'utiliser l'espace mémoire du common du programme appelant. Ça me semble un peu louche. Personnellement, je passe toujours les données requises par paramètre. Dans le cas présent, je créerais un type correspondant au common, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type TCommonX
       real C,B,A
    endtype
    Et je passerais ce type à la routine Seta. Si la DLL inclut plusieurs routines communiquant entre elles par le common X, je copierais la variable CommonX dans le common X au début de Seta et je recopierais le common dans la variable juste avant le retour...

Discussions similaires

  1. Exécuter mon .exe sans code::blocks => erreur dll !
    Par boy30 dans le forum Débuter
    Réponses: 8
    Dernier message: 15/08/2021, 10h57
  2. [PYTHON/FORTRAN] Problème accés à COMMON Block Python Fortran
    Par squallmrs dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 06/06/2012, 17h01
  3. Problème accés à COMMON Block Python Fortran
    Par squallmrs dans le forum Fortran
    Réponses: 0
    Dernier message: 05/06/2012, 11h35
  4. Installation Code Blocks QT - DLL manquante
    Par olino dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 02/10/2009, 10h43
  5. Réponses: 5
    Dernier message: 30/04/2008, 23h39

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