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