Bonjour à tous,
Nouveau en tant que membre sur le forum, cela fait néanmoins quelques années que je viens me documenter ici.
Tout d'abord, le contexte : je développe avec Visual C++ 6.0, Matlab 7.04 R14 SP2. J'ai fais jusqu'a maintenant 2 projets. Dans un de ces projets, j'appele en implicite (utilisation du .lib associé à ma DLL compilée sous Matlab) depuis le C++. Il n'y a aucuns problèmes, mes algo Matlab sont bien exécutés et renvoient des bonnes valeurs.
Mais, maintenant, je voudrais faire en sorte que l'appel se fasse en explicite, par le biais d'un fichier xml ou on pointerait le chemin de mes dll. Depuis mon C++, j'utiliserais les "LoadLibrary" et autres pour charger mes dll, et mes fonctions.
Cette deuxieme étape ne marchant pas, je me suis faite une petite fonction test dans Matlab pour faire plus simple. Cette fonction renvoit le carré de l'argument.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 fonction.m function [ resultat ] = fonction( argument ) resultat=argument*argument;
test dans Matlab, je tape fonction(2), Matlab me dit ans = 4 . Bon !
J'ai ensuite compilé comme d'hab, avec ceci :
(avec compiler : vc6.0),
Code : Sélectionner tout - Visualiser dans une fenêtre à part mcc -W cpplib:libTestFonction -T link:lib fonction.m -v
La dll et le .ctf sont bien créés, je les place par exemple dans le repertoire courant de mon C++. (Ma dll est bien trouvée).
Coté C++, voila ce que j'ai fais. En gros, c'est une chargement dynamique, des initialisations Matlab, et la création des paramètres à faire passer dans la fonction.
sachant que dans le .h :
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
48
49
50
51
52
53
54
55
56
57
58
59
60 bool CConversion::ChargerDLLTEST() { HINSTANCE HandleDLL; UINT uReturnVal; int retour; retour=mclInitializeApplication(NULL,0); if(!retour) { Erreur(); return false; } else { // Chargement de la DLL HandleDLL = LoadLibrary(_T("libTestFonction.dll")); if(HandleDLL != NULL) // chargement bon, cherche pointeur sur fonction d'init { PointeurINIT= (LPFNDLLFUNC_INIT)GetProcAddress(HandleDLL,"libTestFonctionInitialize"); if (PointeurINIT != NULL) { // ok, on va pouvoir appeler la fonction d'initialisation de la fonction; uReturnVal = PointeurINIT(); if(uReturnVal==0) {return false;} else { // Cherche pointeur sur fonction à appeler PointeurTEST = (LPFNDLLFUNC_TEST)GetProcAddress(HandleDLL,"mlxFonction"); if (PointeurTEST != NULL) { // ok, on peut maintenant appeler la fonction int data[]={2}; mwArray argument(1, 1, mxDOUBLE_CLASS, mxREAL); argument.SetData(data,1); mwArray resultat; la ou ca plante >> PointeurTEST(1,resultat,argument); return true; } else {return false;} } } else { //erreur lors du chargement de la fonction FreeLibrary(HandleDLL); Erreur(); return false; } } else { Erreur(); return false; } }
L'init du MCL est bonne, l'init de la fonction est bonne. Par contre, lorsque je passe sur la ligne de l'appel vers la fonction, j'ai le droit à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 typedef UINT (CALLBACK* LPFNDLLFUNC_TEST)(int,mwArray,mwArray); typedef UINT (CALLBACK* LPFNDLLFUNC_INIT)(); LPFNDLLFUNC_TEST PointeurTEST; LPFNDLLFUNC_INIT PointeurINIT;
Cela fait quelques heures que j'essaye de voir d'ou pourrait provenir cette violation d'accès, mais j'avoue de plus avoir d'idées !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 First-chance exception in conversion.exe: 0xC0000005: Access Violation.
Merci d'avance, bonne journée
Partager