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?
Version imprimable
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?
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:
B2) Définir le prototype et localiser les fonctions qui t'intéressent:Code:
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 }
B3) Utiliser la fonctionCode:
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 }
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:
1
2
3
4
5
6 char* param1="Hello World"; int param2=5; int result; result=myFunction(param1,parma2);
Code:
1
2
3 FreeLibrary(libHandle); // Libère la librairie CoUninitialize(); // Free co-initialization for DLLs
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:
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.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 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"); };
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?
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.