J’utilise CVF pour créer un projet MDI et je veux utiliser une DLL sous forme de sous-projet contenant une boîte de dialogue. Le problème c’est que le programme principal se plante lors de l’appel à la fonction qui génère la boîte de dialogue.

Le code source de la DLL que j’ai appelée BurnersClass.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
38
39
40
41
42
43
44
45
46
integer*4 function  ComponentBurner(BurnerTyp,GlobalIcon)
 
!DEC$ ATTRIBUTES STDCALL, REFERENCE,ALIAS :"ComponentBurner":: ComponentBurner  
!DEC$ ATTRIBUTES DLLEXPORT::ComponentBurner
 
include 'resource.fd'         
integer          BurnerTyp
integer          GlobalIcon
 
BurnerMenu%handle=CreateDialogParam(HandleAndInstance%ghInstance,IDD_Component_Tab, &
				                 MDI_WINDOW_Current%Handle, loc(BurnerTab),0)                                      					  					  	
…….
ComponentBurner=0                   
return
end function  ComponentBurner
!======================================================!
 
integer*4 function BurnerTab( hDlg,message,uParam,lParam )		 
!DEC$ ATTRIBUTES STDCALL, REFERENCE,ALIAS :"BurnerTab":: BurnerTab  
!DEC$ ATTRIBUTES DLLEXPORT::BurnerTab
use user32
use kernel32
implicit none   
include "Resource.fd" 
integer hDlg
integer message
integer uparam,lparam		  
type (T_NMHDR) itabmessage                          
select case(message)
             case( WM_INITDIALOG) 			        					    					  					   	
                       ….
	         BurnerTab=1
	        return
          case (WM_COMMAND)                   
                  select case (LOWORD(uParam))
                       case (IDOK,ID_ESCAPE)  				 
                           ….			 				  			     	                          		  
	       end select
          case(WM_move)                      							
                 ….
                ….	
          return				  				  				 				  			     	                         	  
 end select        
 BurnerTab=0		  
 return
end function BurnerTab
Le code source de la partie du programme 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
38
39
40
41
42
43
44
45
46
47
 integer*4 function  BurnersPreprocessing(BurnerTyp)
         !_-_-_-_-_-_-_-_- Compiler options _-_-_-_-_-_-_-_-!
         !DEC$ IF DEFINED(_X86_)
         !DEC$ ATTRIBUTES STDcall, ALIAS : '_BurnersPreprocessing@16' :: BurnersPreprocessing
         !DEC$ ELSE
         !DEC$ ATTRIBUTES STDcall, ALIAS : 'BurnersPreprocessing' :: BurnersPreprocessing
         !DEC$ ENDIF
         use user32
         use kernel32
         use comctl32
         use DFWIN
         use THESSGlobals
         use HeatLibDrawingVar
         use MDI_WindowsVar
         use FuelClass 
         implicit none
         include 'resource.fd'         
         integer          iret
         integer          BurnerTyp
         logical          bret
         integer(HANDLE)  dll_handle(2)
         integer(BOOL)    free_status
         pointer(p_ComponentBurner, ComponentBurner)
 
        interface 
              integer*4 function  ComponentBurner(BurnerTyp,GlobalIcon)
                  !DEC$ ATTRIBUTES DLLIMPORT::ComponentBurner
                  integer       BurnerTyp
                 integer       GlobalIcon                  
              end function ComponentBurner
        end interface    
 
        dll_handle(1) = LoadLibrary ("BurnersClass.dll"C)		
		 if (dll_handle(1) == NULL) then
              ! Failure
              stop
        end if          
 
        p_ComponentBurner = GetProcAddress (dll_handle(1), "ComponentBurner"C)
        if (p_ComponentBurner == NULL) then
           ! Failure
           stop
         end if          		 
         iret = ComponentBurner(BurnerTyp,GlobalIcon)
         BurnersPreprocessing=0      
         return             
 end function  BurnersPreprocessing
Quand je débugue mon programme et que je veux exécuter la ligne de code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
BurnerMenu%handle=CreateDialogParam(HandleAndInstance%ghInstance,IDD_Component_Tab, &
				                 MDI_WINDOW_Current%Handle, loc(BurnerTab),0)
Le message : Unhandelded exception in Main.exe (called BurnersClass.dll):0x000005:Acces Violation s’affiche. Quand je vérifie les valeurs des argument de la fonction BurnerTab à savoir : hDlg message, uParam, lParam j’obtiens :
hDlg = Undefined Adress
message = Undefined Adress
uParam = Undefined Adress
lParam = Undefined Adress
Si vous avez une solution à ce problème ou un simple exemple d’utilisation d’une DLL par un projet fortran MDI je vous serais très reconnaissant.
Merci d’avance.