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?
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 : 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 }
B3) Utiliser la fonction
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 }
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
4
5
6 char* param1="Hello World"; int param2=5; int result; result=myFunction(param1,parma2);
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
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 : 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"); };
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.
Partager