Bonjour,
j'aimerai creer une DLL sous visual C++, puis l'utiliser dans un programme ecrit avec visual C++.
Pouvez vous m'aider?
Merci,
Gael.
Version imprimable
Bonjour,
j'aimerai creer une DLL sous visual C++, puis l'utiliser dans un programme ecrit avec visual C++.
Pouvez vous m'aider?
Merci,
Gael.
tu crées un projet pour faire des dlls sous vs c++ et tu fais générer la lib qui va avec :) et après il te suffis d'avoir l include des fonction, la lib et la dll pour t en servir dans un autre programme.
tu as besoin d'un .h d'un .lib et d'un .dll pour utiliser ta libriaire ensuite?
Le .h pour le nom des fonctions lors de la compilationd e ton projet, le .lib pour l'édition des liens et le .dll pour l'exécution.
Sinon, pour créer des dll, il y a une option dans les propriétés du projet.
J'ai crée un projet de type Win32 Dynamic Link library sous Visual C++ 6.
J'ai crée dans ce projet un .cpp avec dedans :
J'ai crée dans ce projet un .h avec dedans :Code:
1
2
3
4 #include <stdio.h> void function(void) { printf("ma premiere dll.\n"); }
J'ai compilé. Il ne m'a donné qu'un .dll, pas de .lib.Code:void function(void);
Ensuite je fais comment pour utiliser cette librarie dans un projet de type win32 console application? Qu'est ce que je ne fais pas correctement?
salut, pour avoir un .lib, il faut creer un .def avec les fonctions exportées
ex :et il faut exporter les fonctions dans .cpp et .hCode:
1
2
3
4 LIBRARY maLibrairie EXPORTS function @1 function2 @2
tu dois rajouter dans le prototypeCode:extern "C" type __stdcall
:tagcode:
Tu n'as pas de .lib parce que tu n'exportes aucun symbole. Il faut exporter explicitement les fonctions / ... que tu veux utilisables via ta dll.
Le fichier .def est une solution.
L'autre solution, par le code, c'est d'utiliser __declspec( dllexport ) pour l'export, puis __declspec( dllimport ) pour l'utilisation. Pour faire le switch automatiquement entre les 2, on a recours à des macros:
faut définir COMPILE_DLL lors de la compilation de la DLL (options du projet), et puis ça se fait tout seul.Code:
1
2
3
4
5
6
7
8 #ifdef COMPILE_DLL #define MADLL_EXPORT __declspec( dllexport ) #else #define MADLL_EXPORT __declspec( dllimport ) #endif MADLL_EXPORT void function(void);
Et dans les options du projet, on peut normalement aussi dire qu'on veut tout exporter dans un .lib.
Merci!
Avec vos explications, j'ai enfin mon .lib!
Maintenant, comment je fais pour utiliser ma fonction
void function(void) dans un autre projet de type win32 console application?
int main(void) {
function();
return 0;
}
Comment sait il ou aller chercher la lib?
Comme pour toute bibliothèque, c'est toi qui va indiquer dans les options du projet qu'il faut lier avec ton .lib.Citation:
Comment sait il ou aller chercher la lib?
-> En ajoutant son chemin dans "options -> éditeur de lien -> général -> répertoires de bibliothèques supplémentaires"
-> En ajoutant son nom dans "options -> éditeur de lien -> entrée -> dépendances supplémentaires"
(sous VS 2003)
Et n'oublie pas d'inclure l'en-tête qui va avec.
c'est une lib statique alors, et non une dll.Citation:
Envoyé par Miles
Je suis actuellement en train de faire une petite DLL qui regroupe pour l'instant des fonction de convertion.
J'ai fait ce qui était conseillé dans ce poste, mais j'ai d'autre problèmes...
Deja ma DLL s'appel convertion, j'ai ajouter la librairie qui y est associé a mon projet, le .h, mais le programme m'a demander un autre .h : "stdafx.h".
donc voila ce que j'utilise dans le programme :
A la compilation, le programme me met ce message :Code:
1
2
3
4
5 #include "stdafx.h" #include "convertion.h" //j'utilise la DLL convertion (c'est bien comme ca qu'on fait non?) using namespace convertion;
Voici une fonction extraite de ma DLL :Code:c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxv_w32.h(18): fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
Bon je pense bien que j'ai du faire quelquechose qui va pas, mais bon c'est la première fois que je fait une DLL, y'a un début a tout comme on dit!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 template<typename T> //j'ai mis __declspec(dllexport) ici car je ne voyais pas comment pour //definir COMPIL_DLL a la generation du projet comme Aurelien.Regat- //Barrel l'explicait. alors j'ai fait comme dans un tutorial que j'ai trouver // sur un autre site string __declspec(dllexport) ToString(const T & Value) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); //Utiliser un flux de sortie pour créer la chaine ostringstream oss; //écriture de la valeur dans le flux oss<<Value; //Renvoi de la string return oss.str(); }
Je crois que c'est assez explicite :wink:Citation:
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxv_w32.h(18): fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
Pour VS 2003 : options du projet -> C / C++ -> Préprocesseur -> Définitions du préprocesseur. A noter que si tu as fait un projet DLL, le compilo t'a déjà mis un symbole du style MONPROJET_EXPORTS, justement dans ce but.Citation:
//j'ai mis __declspec(dllexport) ici car je ne voyais pas comment pour
//definir COMPIL_DLL a la generation du projet comme Aurelien.Regat-
//Barrel l'explicait
Une fonction template ne s'exporte pas, puisque le compilo doit avoir son code sous la main pour l'instancier. Si tu sais quelles instanciations tu vas utiliser tu peux exporter celles-ci, sinon ne met rien : comme un template doit se trouver dans un en-tête tu pourras utiliser celui-ci partout où tu l'inclues, sans avoir à l'exporter.Citation:
Code:
1
2
3
4
5 template<typename T> string __declspec(dllexport) ToString(const T & Value) { // ... }
Sinon, rien à voir mais conversion s'écrit avec s, pas un t, c'est du HS, mais bon...
Le stdafx.h, c'est parce que tu as créé un projet avec utilisation des en-tête précompilées.
http://c.developpez.com/faq/cpp/?pag...#PROBLEMES_pch
Honte a moi pour la faute d'orthographe!! :oops:
Sinon merci pour vos réponses.
Je vais bosser dessus.
voici ce que j'ai ecrit pour faire la dll :
J'ai compile avec la directive COMPILE_DLL.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 functions.h : #ifdef COMPILE_DLL #define DLL_EXPORT __declspec( dllexport ) #else #define DLL_EXPORT __declspec( dllimport ) #endif DLL_EXPORT void function(void); function.cpp : #include <stdio.h> #ifdef COMPILE_DLL #define DLL_EXPORT __declspec( dllexport ) #else #define DLL_EXPORT __declspec( dllimport ) #endif DLL_EXPORT void function(void){ printf("ma premiere dll.\n"); }
Ensuite, j'ai construit un projet win32 console application, j'ai inclus dans les options du projet le dossier contenant contenant le .dll et le .lib, et le dossier contenant le .h
Dans mon main(), j'ai ecrit:
J'ai compilé sans la directive DLL_COMPILE et a l'edition des liens voici le message d'erreur :Code:
1
2
3
4
5
6 #include "functions.h" int main (void) { function(); return 0; }
:tagcode:Citation:
Linking...
main.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) void __cdecl function(void)" (__imp_?function@@YAXXZ)
Debug/essai.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
Mieux vaut inclure "functions.h" dans "functions.cpp" que de dupliquer des définitions. Bref.
Tu as spécifié l'emplacement du .lib (c'est bien), mais apparement tu ne lui as pas dit d'utiliser ce .lib. De même que tu as spécifié le répertoire du .h, puis que tu lui as dit d'utiliser ce .h via #include, il faut lui dire d'utiliser le .lib.
ou bien via le code (spécifique VC++)Citation:
Envoyé par Loulou24
Code:
1
2
3 #include "functions.h" #pragma comment(lib, "functions.lib")
Merci pour ces infos. Je progresse!
Compilation et edition des liens reussies. C'est a l'execution que ca ne marche pas maintenant.
"cette application ne fonctionne pas car la dll est introuvable".
Que dois je specifier en plus pour qu'il trouve la dll? (ma .dll est dans le meme dossier que le .lib).
Merci
Gael.
il faut qu'elle soit dans le meme repertoire que l'executable
Merci!
Ca marche!
Quelles sont les commandes C++ a ajouter dans le code pour eviter d'avoir a preciser (dans les options de Visual) ou aller chercher le .h et le .lib?
Un nain con petant content.
Il faut que tu ajoutes le chemin vers le .lib dans la liste des chemins pour les bibliothèques et le chemin vers le .h dans celui des includes.
Le fichier.dll doit être dans le dossier du programme ou dans un des dossiers de la variable PATH.
Ca ne se gère pas au niveau du code, donc y'a pas de "commande" C++.
une question toute bete, ca fait au moins 20 minutes que je teste tout ce que peut ajouter visual c++ a un projet mais je trouve pas les *.def ...
c où lol ? dsl de poser la question mais ca m'enerve de creer le .def depuis l'explorateur windows puis de l'ajouter au projet ...
merci d'avance ...
Tu dois le créer toi-même ou dire dans les options du projet que tu veux exporter la bibliothèque, il te créera alors un .lib avec tout dedans.
Je dois être vraiment nul, parceque j'ai recréer un projet pour ma DLL, j'ai intégrer COMPIL_DLL a la précompilation, j'ai mis ce qu'il fallait pour exporter mes fonctions (DLL_EXPORT), je n'utilise plus les en-tête précompilées dans mon projet... et ma DLL ne se compile même pas!!
Voici les erreurs que j'ai (ma dll s'appelle DedeLL) :
J'utilise les string dans ma DLL et malgrès les include ils ne sont pas reconnu...Code:
1
2 c:\Documents and Settings\dede\Mes documents\Visual Studio Projects\DedeLL\DedeLL.cpp(53): error C2511: 'const AFX_MSGMAP *CDedeLLApp::GetMessageMap(void) const' : impossible de trouver la fonction membre surchargée dans 'CDedeLLApp' c:\Documents and Settings\dede\Mes documents\Visual Studio Projects\DedeLL\DedeLL.h(26) : voir la déclaration de 'CDedeLLApp'
Je dois vraiment faire quelque chose de travers mais quoi? SVP aidez-moi.
ça, AFX_MSGMAP, c'est quoi ?