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

  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