peut on exporter une structure définie dans une DLL

peut on exporter une structure définie dans une DLL - C++ - Programmation

Marsh Posté le 26-04-2004 à 15:50:49    

plus précisement j'ai définie une structure dans ma dll, et déclaré un tableau de cette structure. Tout ceci n'est pas exporté car je ne veux pas que l'on puisse modifier le contenu de l'exterieur.
 
 
je veux donc exporter une fonction qui :
1) alloue dynamiquement dans le tableau une "instance" de cette structure (malloc)
2) qui retourne l'adresse de ce tableau.
 
voici donc a quoi ressemble mon header :
 

Code :
  1. struct test
  2. {
  3. char* nom;
  4. int nombre;
  5. };
  6. extern "C" test* __declspec(dllexport) _stdcall Test(void);


 
mais le compilateur semble ne pas apprecier que je retourne un poiteur de type test puisqu'il me dit ceci :
 
warning C4518: '__declspec(dllexport ) ' : classe de stockage ou spécificateur(s) de type inattendu(es) ; ignoré(es)
 
du coup je me demande si c'est possible ou si c'est moi qui m'y prends mal.
 
quelqu'un a une idée sur la question?
 
PS: ma dll doit exporter les fonctions pour du C d'où le extern "C"
 

Reply

Marsh Posté le 26-04-2004 à 15:50:49   

Reply

Marsh Posté le 26-04-2004 à 16:43:29    

c'est toi qui t'y prends mal.
 
sans doute

Code :
  1. extern "C" struct test * __declspec(dllexport) _stdcall Test(void);


conviendrais mieux.
 
Et le extern "C" n'a rien à voir avec l'exportation de ta fonction. C'est le '__declspec(dllexport)' qui tient ce rôle.


Message édité par SoWhatIn22 le 26-04-2004 à 16:44:22
Reply

Marsh Posté le 26-04-2004 à 16:58:21    

oui je voulais dire vu que c'est pour du C ANSI :)
 
j'ai essayé t modif , ca ne change rien pour l'instant au niveau des warning affichés par le compilateur, cela dit ta syntaxe est tres certainement bien plus proche de la réalité que la mienne .


Message édité par giova le 26-04-2004 à 16:58:39
Reply

Marsh Posté le 27-04-2004 à 01:29:45    

tant de personnes qui lisent mon poste et si peu de réponse, je ne sais pas quoi en conclure, idée de cinglé, stade tres avancé, je lance un "Hmmm"  a la bart simpsons quand il est découragé :)

Reply

Marsh Posté le 27-04-2004 à 08:32:06    

question bête: c quoi ton compilo?

Reply

Marsh Posté le 27-04-2004 à 10:59:32    

bah j'utilise visual C++ 2003

Reply

Marsh Posté le 27-04-2004 à 16:11:42    

c'est bon on m'a répondu dans un newsgroup.
 
en fait il faut lorsque c'est défini dans le header, placer  
__declspec(dllexport) avant le type de sortie de la fonction, ce qui donne donc :  
 
extern "C" __declspec(dllexport) test* _stdcall Test(void);  
 
et dans le cpp la définition devient donc :  
 
 
test* _stdcall Test(void)
{
 
}
 

Reply

Marsh Posté le 28-04-2004 à 12:29:09    

Pour info, SoWhatIn22 a raison, si l'on ne précise pas que le type de retour est une structure, ca ne pose pas de PB sous visual qui sait faire le lien (mais le fait il a la sauce CPP? mistere), en revanche sous CVI qui est un compilateur C ANSI, lui ne reconnais pas le type.
donc pour eviter tout probleme la meilleur synthaxe est :  

Code :
  1. __declspec(dllexport) struct test* _stdcall Test(void);


Message édité par giova le 28-04-2004 à 12:30:08
Reply

Marsh Posté le 28-04-2004 à 13:06:52    

Une question ?
 
L'appelant de la DLL, il a accès à la définition de ta structure ?

Reply

Marsh Posté le 28-04-2004 à 13:44:03    

oui biensur puis qu'elle est faite dans le header de la dll (voir mon premier post sur ce topic), autrement dit la partie visible vis a vis du client.
 
EDIT : client = l'appellant


Message édité par giova le 28-04-2004 à 13:46:55
Reply

Marsh Posté le 28-04-2004 à 13:44:03   

Reply

Marsh Posté le 28-04-2004 à 19:07:20    

Alors il ne te reste qu'à faire une fonction qui fait une copie de ta structure lorsque l'appelant la demande. N'oublie qu'il faudra également détruire cette copie de structure...

Reply

Marsh Posté le 29-04-2004 à 01:02:32    

bah non (enfin si tu veux oui pourquoi pas mais c con de le faire ca fait une recopie inutile) le mieux c de travailler avec des pointeurs.
 
tu crée un pointeur sur ce type de structure dans ton code client et tu le balance en parametre a la fonction qui travaille directement dessus.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed