Utilisation d'une Dll

cs_sandy27 Messages postés 20 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 6 août 2008 - 5 août 2008 à 16:31
cs_sandy27 Messages postés 20 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 6 août 2008 - 6 août 2008 à 09:19
Bonjour,

Je vais essayer d'être claire et aussi brève que possible. J'ai réçu d'un fournisseur un code C sous forme de Dll, contenant:
- un .lib
- un .dll
- un .h contenant la déclaration de la fonction principale à utiliser, sous la forme:
   extern __declspec(dllexport) void step_FLUID_NETWORK( double VAR1, int *Var2,
                                                                                                               double *Var3 ) ;
Cette Dll, j'ai réussi à l'uliser en faisant un #include du .h dans mon source .c, en appelant la fonction telle que définie dans le .h, et en compilant avec le .lib rajouté dans les liens. Tout marche miraculeusement et merveilleusement bien.

Maintenant, place à mon problème: j'essaie de créer une Dll que j'utiliserais de la même manière. J'ai déclaré ma fonction principale avec "extern __declspec(dllexport)" aussi bien dans le code de ma Dll que dans le code source utilisateur. Ca doit à peu près marcher car j'ai vérifié que mon code utilisateur entrait bien dans la fonction de la Dll. Rajoutez à cela des variables globales définies dans un .h dans lequel je définis les entrées/sorties du modèle, et auxquelles j'assigne des valeurs dans le code utilisateur. Dans ma Dll, les variables globales sont déclarées sous la forme "__declspec(dllexport) int var1" par exemple. Dans mon code utilisateur, si j'utilise "__declspec(dllimport) int var1" comme j'avais cru comprendre qu'il il fallait le faire, je me fais jeter à la compilation (pbm sur _imp__var1 ?!). Si j'utilise "__declspec(dllexport) int var1" je ne me fait pas jeter, mais lorsque le code utilisateur entre dans la fonction Dll, var1 n'a pas pris la valeur que je lui ai assigné. Est-ce que quelqu'un a une vague idée de la manière de procéder ? pourquoi le fait d'utiliser "__declspec(dllexport) " aussi bien dans la dll que dans le programme utilisateur fonctionne sur les fonctions mais pas sur les variables globales ?

merci d'avoir tout lu !
Sandy

6 réponses

SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
5 août 2008 à 16:55
Salut,
Si tu as inclut le .h et lié le .lib, tu n'as pas besoin de la dll. (cf lib statique / dynamique)
Est-ce que l'éditeur de lien lie correctement ton projet si tu retires la dll ?

Pour ton problème:
Il faut écrire une fonction d'affectation de la valeur de la variable
dans le code de la dll. Le .h n'est qu'une déclaration.

Montre un bout de code, les romans d'info c'est pas mon fort.

Cordialement,
Sébastien.
0
cs_sandy27 Messages postés 20 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 6 août 2008
5 août 2008 à 17:10
oui, je compile correctement sans le .dll, par contre, je pourrai pas exécuter...
sinon, pour le code de la Dll, ça va ressembler à ça :

#include "Data_Dll.h"
#include "prototypes.h"

void Fonction_principale(void)
{
      blablabla...;

      appel à plusieurs autres fonctions;

      ...
      return;
}

le fichier "Data_Dll.h" lui ressemble à ça:
" __declspec(dllexport)  int var1;
  __declspec(dllexport)  int var2;
...
extern __declspec(dllexport)  void Fonction_principale(void);    "

Et côté utilisation, mon code donnerait ça:
#include "Data_Dll.h"

void Fonc_util (void)
{
      var1 = bla;
      var 2 = blabla;
      ...
     Fonction_principale( );  
}

et ça là que ça coince, si je vais voir dans Fonctin_principale, var1 ne vaut pas bla, mais 0 !

Sandy
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 août 2008 à 18:05
Pouquoi ne pas passer tt simplement tes variables a ta fonction de cette facon:
Fonction_principale(var1, var2); ?
Si c'est pour pouvoir modifier var1 et var2 ou tu veux passe alors des pointeurs a ta dll..

Neo_Fr
0
cs_sandy27 Messages postés 20 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 6 août 2008
5 août 2008 à 19:10
et bien parce que j'ai une énorme quantité de variables à traiter... il n'y a pas d'autre solution que les arguments ? ça parait bizarre... j'avais volontairement choisi les variables globales...

Sandy
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
5 août 2008 à 20:01
Dans ce cas creer une structure et tu passe a ta fonction un pointeur sur ta structure.

Ex:

typedef struct _mystruct
{
int var1;
int var2;
}MYSTRUCT, *LPMYSTRUCT;

void Fonction_principale(LPMYSTRUCT lpms)
{
lpms->var1 = 16;
lpms->var2 = 4096;
return;
}

Neo_Fr
0
cs_sandy27 Messages postés 20 Date d'inscription lundi 10 octobre 2005 Statut Membre Dernière intervention 6 août 2008
6 août 2008 à 09:19
merci, je vais essayer ça...  (mais je comprend pas en quoi j'avais faux avant !)

Sandy
0
Rejoignez-nous