begin process at 2012 05 30 01:43:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Problème d'appel de fonction d'une DLL en C


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème d'appel de fonction d'une DLL en C

vendredi 22 juillet 2005 à 11:24:04 | Problème d'appel de fonction d'une DLL en C

richard22

Bonjour

Voici mon problème:
je réalise une DLL avec cette fonction:

DLLIMPORT int Algo(int **result)
{    etc...    }

et dans un fichier .h :

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


DLLIMPORT int Algo(int **result);

#endif /* _DLL_H_ */

Jusque là tout vas bien.
Puis lors de la réutilisation de cette fonction dans un autre programme C il m'est impossible d'envoyer un tableau à deux dimensions dans la DLL.

Voici les initialisations que je réalise:

typedef int (WINAPI *DLL_Function)(int *_Value);

puis dans le main:

Dll_Algo= (DLL_Function)GetProcAddress(hDLL,"Algo");
...
detection=Dll_Algo(MatriceInt); /* erreur ici */

avec MatriceInt[4][21]

et mon erreur est celle-ci :232 : cannot convert `int (*)[21]' to `int*' in argument passing
Je cherche donc a faire passer mon tableau dans la DLL pour y faire un algorithme précis mais je bloque sur l'envoie de ce tableau...

Mon environnement de déveloipppement est DEV C++

Merci d'avance pour votre attention et vos réponses

vendredi 22 juillet 2005 à 11:56:48 | Re : Problème d'appel de fonction d'une DLL en C

ricky78

essaye cela

detection=Dll_Algo(&MatriceInt);



TOCHE
vendredi 22 juillet 2005 à 12:03:29 | Re : Problème d'appel de fonction d'une DLL en C

richard22

non ça fonctionne pas :( erreur: cannot convert `int (*)[4][21]' to `int*' in argument passing
vendredi 22 juillet 2005 à 12:24:34 | Re : Problème d'appel de fonction d'une DLL en C

ricky78

re
Ce tuto explique les pointeurs pout des tableaux a une dimension, il doit surement etre transposable pour des tableau a 2D
[ Lien ]


En general a 1D

int Algo(int *result);

*result = 10;

appel de la fonction  : algo(&result)

en 2D je ne sais pas sinon passe ta matrice en une dimension dans l'echange entre fonction puis remet la en 2D si tu veux dans ta fonction

vendredi 22 juillet 2005 à 13:32:18 | Re : Problème d'appel de fonction d'une DLL en C

AlexMAN

Membre Club
typedef int (WINAPI *DLL_Function)(int *_Value);

Ta fonction attend un tableau a 2 dimensions, pourquoi le prototype ne comprend qu'une seule dimension ?!

typedef int (WINAPI *DLL_Function)(int **_Value);

Et que vient faire ce WINAPI ? Je vois que tu ne definis pas cette convention d'appel dans la DLL (WINAPI == __stdcall), donc soit tu l'enleves du prototype, soit tu le mets dans la DLL.

+2(p - n)
lundi 25 juillet 2005 à 18:58:33 | Re : Problème d'appel de fonction d'une DLL en C

bathof

J'ai deux solutions à ton problème :

La première solution
:  si tu programmes en c++ tu peux créer un tableau dynamique à deux dimentions avec new et delete ou si tu programmes en c avec malloc et free, solution recommandée.
Attention : sizeof sur un pointeur renvoie la taille du pointeur et non pas la taille du tableau.

Exemple avec new et delete (c++) :

// Création de ton tableau dynamique à deux dimentions
// Dans cette exemple le tableau sera " Tab [2][4] "
int** Tab = NULL;
int     NbrCol  =  4;
int     NbrLig   =  2;

Tab = new int* [NbrLig];

for(int I=0; I<NbrLig; I++ )
Tab[I] = new int [NbrCol];


// Tu  le passes en paramètre de ta fonction
Algo(Tab);

// Et quand tu en as plus besoin tu le detruis (IMPORTANT, sinon la ram sature )
/* Attention une fois détruit tous les pointeurs qui pointent vers cette zone mémoire
    ne seront plus utilisables, valeur incorrect   */
for(int I=0; I<NbrLig; I++)
delete [] Tab[I];
delete [] Tab;
Tab = NULL;


La deuxieme solution :  Il faut modifier ta fonction comme cela, cette solution n'est pas la bonne mais elle fonctionne.

DLLIMPORT int Algo(int* tempresult, int SizeLigne)
{
 #define result(X,Y,Z) tempresult[ (X*Z)+Y ]
 int NbrCol = (SizeLigne/sizeof(int));

// Afficher une partie du tableau result[0][0]
printf("%d", result(0,0,NbrCol) );

// Modifier une partie du tableau result[0][0] = 2
result(0,0,NbrCol) = 2;

 #undef  result
}


// et dans ton programme
int Tab[2][4];

Algo( (int*)*Tab, sizeof(Tab[0]) );

voila j'éspère que cela ta aidé, bonne chance et a +



Cette discussion est classée dans : fonction, int, dll, algo, dllimport


Répondre à ce message

Sujets en rapport avec ce message

Pour les doués, moi j'en peu plus ! [ par sena ] Salutje voudrais en fait faire un passage de paramètre a une fonction dont un a une valeur par défaut. (puis inclure ca dnas une DLL)Par exemple une f linker une dll sous dev-c++ [ par the diouk ] petite question toute bête mais qui me gêne :j'utilise une DLL, dans ma source il y a bien :#define TRUCDLL "TRUC.dll";le prototype de la fonction :in Uttilisation la fonction d'une DLL [ par aDebhian ] Pour ce faire, j'ai lu msdn, codes-sources et j'en suis arrivé à ceci: [FONCTION DLL] extern "C" __declspec(dllexport) int tests(int test) {     retu probleme de dll [ par lamoueste ] j'ai un probleme avec ma dll : il s'agit d'une fonction qui doit lance une fenetre (dialog box ) en modal mais j'ai une "assertion failed" :( et je ne Appel d'une fonction contenue dans une dll [ par ybuchheit ] Bonjour, je souhaiterais appeler une fonction contenue dans une dll. Je n'ai pas le source de cette dll, le seul fichier dont je dispose est le .dll pointeur sur une fonction [ par pasty ] Bonjour,J'appelle une fonction f(int *,int *,int) dont le code  est dans un DLL depuis le programme principal main.cpp Je déclare la fonction dans m Pb Hook.... [ par Mr_Coinche ] Bonjour,J'ai crée une dll très simple appelée "DllMaths.dll", qui contient deux fonctions, "carre" et "cube", je vous laisse deviner ce que ces foncti la fonction gotoxy() [ par S_M_E ] c encore moi personne n'a encore répondu à mon problème, JE VEUX DEPLACE le curseur de le fenetre dos à des endroit bien précis ave DEV C++, j'ai trou exemple de creation et utilisation d'un simple dll . [ par bonapart002 ] Bonjour:je suis débutant en c++ .je travail  avec Borland C++ 5.01.je veux créer une dll puis l'utiliser dans un programme .pour cela j'ai crée  un pr [WinAPI] fonctions graphiques [ par riked ] Bonjour (ou bonsoir), Je suis nouveau sur cppfrance et je vient vous exposer mon problème. Je fait actuellement un programme qui à pour but d'affich


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,388 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales