[COMPILER] DLL Matlab, Projet C++ et appel explicite
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:
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 !:lol:
J'ai ensuite compilé comme d'hab, avec ceci :
Code:
mcc -W cpplib:libTestFonction -T link:lib fonction.m -v
(avec compiler : vc6.0),
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.
Code:
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;
}
} |
sachant que dans le .h :
Code:
1 2 3 4 5
|
typedef UINT (CALLBACK* LPFNDLLFUNC_TEST)(int,mwArray,mwArray);
typedef UINT (CALLBACK* LPFNDLLFUNC_INIT)();
LPFNDLLFUNC_TEST PointeurTEST;
LPFNDLLFUNC_INIT PointeurINIT; |
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:
1 2
|
First-chance exception in conversion.exe: 0xC0000005: Access Violation. |
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 !!!
Merci d'avance, bonne journée