IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

[COMPILER] DLL Matlab, Projet C++ et appel explicite


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Par défaut [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 : 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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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;
    	}
    	}
    sachant que dans le .h :

    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;
    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
     
    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

  2. #2
    Membre Expert
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 5
    Par défaut
    Bonjour,

    Merci.
    J'obtiens en effet comme décrit plusieurs (centaines) de messages de ce genre, déjà dans mon projet ou je chargeais les dll en implicite, et dans ce projet-ci lorsque j'initialise mes fonctions.

    Mais ma violation d'accès stoppe l'execution, contrairement aux autres "first chance exceptions".

    J'ai déjà tenté d'entourer ma fonction avec les blocs try catch... mais ils ne m'ont pas plus renseignés. (unexpected error thrown)

    Depuis, j'ai essayé avec une fonction Matlab qui ne prend aucun argument, et ne renvoie aucun resultat. la fonction écrit dans un fichier une chaine de caractères. Et cette fois-ci, l'appel vers la fonction marche, j'obtiens bien mon fichier après execution du C++.

    Je pense donc que cela vient de la maniere dont je déclare ou fais passer mes arguments...?

    Bonne journée

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/04/2011, 20h54
  2. Compilation Dll avec plusieurs projets
    Par Fooshi dans le forum Visual Studio
    Réponses: 1
    Dernier message: 30/10/2010, 14h59
  3. Appel de DLL MATLAB depuis un programme C
    Par jericho dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/02/2008, 16h09
  4. Réponses: 5
    Dernier message: 04/10/2007, 09h38
  5. [COMPILER] compilateur matlab DLL
    Par solor dans le forum MATLAB
    Réponses: 1
    Dernier message: 23/07/2007, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo