Utilisation d'une Dll

Signaler
Messages postés
20
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
6 août 2008
-
Messages postés
20
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
6 août 2008
-
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

Messages postés
212
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
23 juin 2011

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.
Messages postés
20
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
6 août 2008

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
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
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
Messages postés
20
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
6 août 2008

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
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
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
Messages postés
20
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
6 août 2008

merci, je vais essayer ça...  (mais je comprend pas en quoi j'avais faux avant !)

Sandy