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.
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 avecet 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 .h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LIBRARY maLibrairie EXPORTS function @1 function2 @2
tu dois rajouter dans le prototype
Code : Sélectionner tout - Visualiser dans une fenêtre à part extern "C" type __stdcall
![]()
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.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.
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
c'est une lib statique alors, et non une dll.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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 explicitec:\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.//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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<typename T> string __declspec(dllexport) ToString(const T & Value) { // ... }
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
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!!![]()
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #include "functions.h" int main (void) { function(); return 0; }
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++)Envoyé par Loulou24
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager