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 :
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 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
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
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
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 :
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)
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.hDlg = Undefined Adress
message = Undefined Adress
uParam = Undefined Adress
lParam = Undefined Adress
Merci d’avance.
Partager