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

C++Builder Discussion :

Call DLL from C


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par d�faut Call DLL from C
    Bonjour,
    J�ai cree une une library dll avec matlab et j�aimerai pouvoir l�appeler avec un programme en C. Mon probleme c�est que je ne sait pas comment faire pour pouvoir ouvrir ce .dll avec c++ builder 6. Y a t il quelque chose de special a creer?

  2. #2
    Membre chevronn�

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par d�faut
    Salut,

    Tu peux te connecter � une DLL dynamiquement ou statiquement.

    Dans l'approche statique le programme se connecte automatiquement au d�marrage de ton application et tu n'as rien � faire pour utiliser les fonctions de la DLL. Avantage: facile � utiliser; d�savantage: la DLL est charg�e m�me si tu ne l'utilises pas et il faut avoir le fichier .lib

    Dans l'approche dynamique, tu dois charger manuellement la DLL en m�moire et aller chercher les fonctions. Avantages: tu ne charges la librairie que si tu en as besoin et pas besoin du fichier .lib; d�savantage: il faut g�rer le chargement et la lib�ration de la DLL et conna�tre les noms des fonctions ainsi que leur prototype.

    A) Approche statique:
    A1) Tu ajoutes le fichier .lib � ton projet
    A2) Tu utilises les fonctions de la librairie comme si elles faisaient partie de ton code.

    B) Approche dynamique:
    B1) Il faut charger le librairie en m�moire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
          // Pour pouvoir partager la mémoire avec la DLL
          CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
     
          // Load the library
          HMODULE libHandle=LoadLibrary(dllName.c_str());
          if (libHandle==NULL) {
            // Error
          }
    B2) D�finir le prototype et localiser les fonctions qui t'int�ressent:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
         // Définir le prototype de la fonction (p.ex. "int XXXXX(char*,int)" )
         typedef int (DLLExport *MyPrototype)(char*,int);
     
        // Aller chercher la fonction dans la DLL
          MyPrototype myFunction=(MyPrototype)GetProcAddress(libHandle,"NameOfFunctionInDll");
          if (myFunction==NULL)
             // Error         
          }
    B3) Utiliser la fonction
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
      char* param1="Hello World";  
      int     param2=5;
      int     result;
     
      result=myFunction(param1,parma2);
    B4) A la fin de ton programme (ou avant si tu n'utilises plus la DLL), il faut la lib�rer de la m�moire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
          FreeLibrary(libHandle);   // Libère la librairie
          CoUninitialize();                   // Free co-initialization for DLLs

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par d�faut
    Merci pour ta reponse patrick,
    en faite j�ai le fichier .lib, il est creer en meme temps que le .dll sous matlab.

    J�ai fait un petit programme en c a l�aide de l�exemple donnee par matlab matrixdriver je crois. D�apres ce que tu dis c��st plutot l�approche statique que j�ai essaye.
    J�ai inclus le .h de ma librarie et j�ai ajoute dans mon projet le .lib

    J�ai utilise ces fonctions pour la mCR
    mclInitializeApplication
    libswInitialize

    et apres j�ai pu appeler ma function contenue dans ma librairie.

    mlfInitdoe(int nargout, mxArray** x , mxArray* pdim, mxArray* lbbox , mxArray* ubbox);

    J�ai pu afficher le resultat sous forme d�un tableau a l�aide:
    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
    void display(const mxArray* in)
    {
          int i=0, j=0; /* loop index variables */
          int r=0, c=0; /* variables to store the row and column length of the matrix */
          double *data; /* variable to point to the double data stored within the mxArray */
          double array1 [13][2];
     
          //double array [taille];
     
        /* Get the size of the matrix */
          r = mxGetM(in); //number of rows
          c = mxGetN(in); //number of columns
     
     
     
        /* Get a pointer to the double data in mxArray */
          data = mxGetPr(in); //Get real data elements in mxArray
     
     
        /* Loop through the data and display the same in matrix format */
          for( i = 0; i < r; i++ ){ printf("%d ",i);
               for( j = 0; j < c; j++){
                  printf("     %04.2f\t",data[j*c+i]);
                  array1 [i][j]= data[j*c+i];
                  printf("array1 %d %d %lf  ",i,j,array1[i][j] );
     
     
     
                  //add the way to keep each data to can reuse it and evaluate it
     
                  }
               printf("\n");
             }
     
        printf("\n");
     
     
    };
    Mais mon probleme maintenant c�est de bien comprendre ce que je fais, parce que j�utilise des pointeurs et des mxArrays mais je suis un peu perdue.
    je voudrais pouvoir utiliser les valeurs contenues dans le mxArray que pointe la sortie de ma function dans mon main et pour l�instant j�arrive seulement a les afficher.
    Comment puis je faire pour pouvoir utiliser les valeurs contenus dans le tableau qui est renvoyee par la fonction mlfinitdoe?
    L�approche statique permet t elle de faire la meme chose que l�approche dynamique?

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    116
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 116
    Par d�faut
    Je me reexplique.
    La fonction de ma librarie est initode et elle prend comme input trois mxArray* que je cree avec des mxcreateDoubleMatrix et comme output un mxarray*.

    Quand j apelle ma fonction mlfinitdoe(1, &out, mxArray in1, mxArray in2, mxArray in3) j�aimerai savoir s�il y a une methode pour recuperer les valeurs stockees dans le mxArray* out.
    Et aussi je ne comprend pas pourquoi on doit utiliser & devant out alors que la fonction mlfinitdoe demande un mxArray* en sortie.
    Si j�ai bien compri ce qu�est un pointeur, la function copie l�adresse de out dans la valeur pointe par le mxArray de output.

Discussions similaires

  1. [EJB3 Entity] Illegal to call this method from injected, managed EntityManager
    Par Invit�(e) dans le forum Java EE
    R�ponses: 3
    Dernier message: 19/01/2010, 17h43
  2. R�ponses: 4
    Dernier message: 25/02/2009, 12h10
  3. R�ponses: 9
    Dernier message: 19/12/2007, 15h42
  4. Call stored procedure from trigger
    Par DAGADA dans le forum SQL
    R�ponses: 3
    Dernier message: 24/05/2007, 13h33

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