Faire une DLL sous Visual .NET ? - C++ - Programmation
Marsh Posté le 08-03-2005 à 09:10:38
Oué, tu fais une DLL avec l'options 'export symbols' de cocher, pis apres tu lis les commentaires dans le code généré pour comprendre comment ca marche.
Marsh Posté le 08-03-2005 à 16:13:53
J'ai fait comme tu m'as dit, mais il y a un problème, je n'arrive pas à importer la classe dans le programme client. G mis :
extern "C" __declspec(dllimport) class Cserie;
Mais erreur ! Il me dit que la partie à gauche de class Cserie a été ignoré par le compilateur car il n'y a pas de déclaration de variable.
J'utilise un pointeur sur fonction crée grâce à un handle et GetProcAddress(). Mais même lorsque je déclare la classe Cserie dans le programme client et que je crée un objet de type Cserie, je ne peux pas utiliser le pointeur de fonction crée (pfn_Lire()) avec cet objet, car pfn_Lire n'est pas de type Cserie .
Auriez-vous une idée ?
Merci d'avance !!!
Marsh Posté le 08-03-2005 à 17:53:28
Code :
|
Marsh Posté le 08-03-2005 à 22:20:24
FlorentG a écrit : Tu la fait en quel langage ta DLL ? |
en c++
Marsh Posté le 08-03-2005 à 22:21:41
HelloWorld a écrit :
|
Ca je l'ai mis dans le code ma DLL, mais dans le programme client, comment je l'importe cette classe?
Marsh Posté le 08-03-2005 à 23:19:11
Mackila a écrit : Pareil. |
Ok mici, je vais essayer !
Marsh Posté le 08-03-2005 à 23:20:36
Sans rien faire. Si tu lis le code, c'est pour exporter qu'il faut définir COMPILE_MYLIB_DLL (dans les projects settings de ta dll). Le .h reste inchangé entre code dll / client.
Marsh Posté le 08-03-2005 à 23:23:19
HelloWorld a écrit : Sans rien faire. Si tu lis le code, c'est pour exporter qu'il faut définir COMPILE_MYLIB_DLL (dans les projects settings de ta dll). Le .h reste inchangé entre code dll / client. |
Marsh Posté le 08-03-2005 à 23:24:35
"Il en faut peu pour être heureux, oui vraiment peu pour être heureux..."
Marsh Posté le 08-03-2005 à 23:27:09
HelloWorld a écrit : "Il en faut peu pour être heureux, oui vraiment peu pour être heureux..." |
Je galère tlmt, je suis trop content d'avoir des réponses, merci à vous ! Je vais essayer, et je vous dirait si ça marche ou pas !
Marsh Posté le 10-03-2005 à 09:08:37
Je n'y arrive tjrs pas (g ptêt raté kek chose !)
Je vais vous mettre les sources, dsl pour la longueur
Le fichier de ma DLL : DLL_RS232.cpp
Code :
|
Maintenant le fichier DLL_RS232.h
Code :
|
Le fichier DLL_RS232.def
Code :
|
////////////////////////////////////////////////////////////////////////
Maintenant le code de l'appli cliente:
Le fichier RS232_avec_DLL.cpp:
Code :
|
Et finalement le fichier RS232_avec_DLL.h !
Code :
|
Heu ben voilà koi !
Je sais que c bcp de code d'un coup , mais svp, vous pouvez jeter un petit coup d'oeil pour me dire ce qui ne va pas?
Merci bcp bcp d'avance !
Marsh Posté le 10-03-2005 à 11:31:39
Commence par récupérer dependency walker et regarde ce que ta dll exporte vraiment.
Ensuite vire ton .def et ton LoadLibrary/GetProcAddress/FreeLibrary et utilise le fichier .lib généré avec ta dll.
Pour la classe Cserie, DLL_RS232_API ne doit être mis que lors de sa déclaration (dans le .h).
nDLL_RS232, Lire, Ecrire ils servent à quoi ?
Marsh Posté le 10-03-2005 à 11:46:13
HelloWorld a écrit : Commence par récupérer dependency walker et regarde ce que ta dll exporte vraiment. |
Lire permet de lire sur le port série, Ecrire permet d'écrire sur le port série et nDLL_RS232...euh... ...c une m**** générée par visual lors de la création du projet que j'ai oublié d'enlever
Marsh Posté le 10-03-2005 à 12:07:34
Je disais ça parce que elles sont implémentées nul part...
Marsh Posté le 10-03-2005 à 13:17:50
HelloWorld a écrit : Je disais ça parce que elles sont implémentées nul part... |
Si, elles sont là. C pas ça kil faut mettre?
Dans DLL.cpp:
Code :
|
Marsh Posté le 10-03-2005 à 13:24:39
Ca c'est les fonctions membres de ta classe Cserie. Moi je parle de ça:
Code :
|
qui ne sont pas membres de Cserie...
Marsh Posté le 10-03-2005 à 13:59:05
HelloWorld a écrit : Ca c'est les fonctions membres de ta classe Cserie. Moi je parle de ça:
|
A quoi elles vont servir si elles ne sont pas membres de la classe Cserie? Mon_Objet est de type Cserie, il ne pourra pas s'en servir. Ou alors g vraiment rien compris lol !
Marsh Posté le 10-03-2005 à 16:17:39
Cserie::Lire() est une fonction différente de Lire().
C'est du C++ de base ça hein, rien à voir avec les dll.
Marsh Posté le 10-03-2005 à 21:20:41
oui je sais que c différent, mais je comprenais pas pourquoi tu me disais de mettre les implémentaions de Lire() et Ecrire() vu qu'elle ne me servent pas si elles ne sont pas membres de Cserie.
Au fait, merci pour tout, j'ai réussi à faire cette fichue DLL. J'ai mis le .dll et le .lib dans le dossier Debug de l'appli cliente, j'ai mis extern "C" __declspec(dllimport) API_DLL_RS232 DWORD Ecrire(void *pbuf, DWORD pnb ); (idem pour Cserie::Lire()) dans le .h de l'appli cliente, ainsi que la déclaration de la classe dans ce même .h avec class API_DLL_RS232 Cserie{méthodes et variables membres};. Finalement, j'ai inséré le .lib et .dll dans le projet de l'appli cliente avec "insérer un élément existant". Voilà ! Merci pour tout !
Marsh Posté le 11-03-2005 à 10:48:51
Ben si Lire() et Ecrire() ne servent pas, faut pas les mettre alors...
Enfin t'y est arrivé c'est ce qui compte.
Marsh Posté le 12-03-2005 à 14:21:59
Salut JuJu ! Toujours pas trouvé de solution ? j'te plains, cela dit, bonne révision ce week end pour l'éco !
Marsh Posté le 08-03-2005 à 09:07:26
Bonjour à tous et aux autres!
Je suis en 2ème année de BTS IRIS sur un projet étudiant, et je dois faire une DLL sous Visual Studio .NET.
Le problème, c'est que je n'arrive pas à exporter des méthodes et des classes utilisables dans un programme client.
Je me sers de la classe CSerie contenue dans la DLL (qui contient également les méthodes lire() et ecrire() de la classe CSerie).
Est-il possible également de créer un objet de type CSerie dans un programme client en important la classe CSerie à partir de la DLL?
Merci pour vos réponses !!!
---------------
Est-ce de l'info que tu respires ? Arrête d'essayer de programmer, fais-le !