je l'ai remis (je l'avais enlevé dans le CPP) ça ne change rien.
je l'ai remis (je l'avais enlevé dans le CPP) ça ne change rien.
j'ai chargé dans mon appli une autre DLL que j'ai écrite. pas de problème elle marche
DLL d'essai:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #define EXPORT extern "C" __declspec(dllexport) EXPORT double SquareRoot(double d);
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 #include "stdafx.h" #include "basicDLL.h" #include "math.h" //------------------------------------------------------------------------------ BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } //------------------------------------------------------------------------------ EXPORT double SquareRoot(double d) { if (d>=0.0) return sqrt(d); else return ZERO; }
je ne comprend pas, j'ai écrit la 2è DLL sur le même modèle.
est-ce à cause des classes que j'utilise ?
ces classes sont connues dans le code qui appelle la fonction de la DLL, ça ne devrait pas poser de problème.
faut-il que j'exporte les classes utilisées dans la fonction de la DLL, ou le fait qu'elles soient déjà définies dans le code appelant de mon appli est-il suffisant?
Non.Envoyé par bigboomshakala
Tu as clairement un problème dans ta DLL. La fonction que tu crois exportée ne l'est pas.
Au niveau de la DLL, tu n'as aucune différence dans la signature de analyse_spec dans le .h et le .cpp ? notamment le CALLBACK.
Fais voir le code des signatures stp
bonjour,
dans le .h de ma dll
dans le .cpp de ma dll
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #define EXPORT extern "C" _declspec(dllexport) EXPORT void analyse_spec (double val_anno, string contrainte, so_entite * pEntite,so_entite * pRef1, so_entite * pRef2, so_entite * pRef3,\ vector<int> capa_eb, vector<int> capa_dfi, vector<int> capa_fi,vector<so_contrainte *>);
(j'ai essayé avec et sans _declspec(dllexport))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 _declspec(dllexport) void analyse_spec (double val_anno,string contrainte,\ so_entite * pEntite,so_entite * pRef1, so_entite * pRef2, so_entite * pRef3,\ vector<int> capa_eb, vector<int> capa_dfi, vector<int> capa_fi,vector<so_contrainte *> & vContrainte) { ... }
dans le code appelant
j'ai aussi essayé
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 typedef void (ANALYSESPEC)(double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&); ... HINSTANCE hInstance; ANALYSESPEC * pAS; hInstance = LoadLibrary("E:\\Utilisateurs\\Falola\\_SAUVEGARDES\\Analyse_Spec\\Release\\Analyse_Spec.dll"); typedef double (SQRTPROC)(double); HINSTANCE hInstance2; SQRTPROC * pSquareRoot; hInstance2 = LoadLibrary("E:\\Utilisateurs\\Falola\\_SAUVEGARDES\\basicDLL\\Release\\basicDLL.dll"); pSquareRoot = (SQRTPROC*) GetProcAddress(hInstance2,"SquareRoot"); if (pSquareRoot) AfxMessageBox("ok"); if (hInstance!=NULL) { //ptr = (pANALYSESPEC) GetProcAddress(hInstance,"pAnalyse_spec"); pAS = (ANALYSESPEC*) GetProcAddress(hInstance,"analyse_spec"); if (!pAS) { FreeLibrary(hInstance); AfxMessageBox("erreur"); } else { //pAS = ptr(); vector<int> v1(14),v2(14),v3(14); for (int w=0;w<14;w++) { v1[w] = 100; v2[w] = 100; v3[w] = 100; } vector<so_contrainte*> vContrainte(3); (*pAS)(1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3,vContrainte); FreeLibrary(hInstance); } }
OH ! je remarque à l'instant que dans la signature de analyse_spec du .h il manque '&' après vector<so_contrainte*>.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 typedef void (CALLCACK* ANALYSESPEC)(double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&); ...
j'espère que l'erreur vient de là
je suis pas sur que l'on puisse exporter dans une dll classique une fonction qui contient une reference aux stl.
vu que l'on exporte des fonctions en C les stl c'est pas du C .
au pire je transmettrais des pointeurs void a la place des vector ....
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
oui j'y ai pensé hier!
je pensais tester ça demain.
si j'ai le courage, j'installe VC++ et la MSDN chez moi et je regarde à ça tout à l'heure.
faut que je speed. une semaine avant la fin du stage. et comme j'ai fait pas mal de choses et que ça marche, on m'en demande toujours plus.
encore un peu de courage
dans un exemple simple, je viens de vérifier que l'on peut utiliser les vector dans les dll.
j'ai modifié dans ma dll de tests la fonction SquareRoot pour qu'elle prenne un pointeur sur vector en paramètre
dans le code appelant j'ai
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 EXPORT double SquareRoot(double d,vector<int> * v) { (*v).resize(1); (*v)[0] = 10; if (d>=0.0) return sqrt(d); else return 0; }
et en affichant v[0] dans un AfxMessageBox j'ai bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 v[0] = 3; m_dOutput = (*pSquareRoot)(m_dInput,&v);
par contre si je passe une référence au lieu d'un pointeur sur le vecteur, ça ne me renvoie pas le bon résultat (mais ça ne plante pas)
Code : Sélectionner tout - Visualiser dans une fenêtre à part v[0] = 10
yeah !!!
c'est bon ma DLL marche. c'était bel et bien à cause de la signature qui n'était pas la même dans le .H et dans le .CPP
(erreur idiote !!! comme la plupart que l'on fait)
tout ça à cause d'un '&'
merci à tous, je respire
Pour les référence c'est normal. c'est exclusivement C++. Alors que ta fonction est marquée extern C.
Mais ça ne plante pas à la compil ??
ouaip c'est tres bizarre tout ça !
ça ne devrait pas fonctionner !
Ce qui est affirmé sans preuve peut être nié sans preuve Euclide.
Les conversions numériques en C,C++,C++/CLI
DLL d'extensions : écriture d'un plug-in de classe
Démarrer avec les MFC 2/2
Création d'un ActiveX MFC
Intégration d'une imprimante PDF pour éditions automatisées
Migrer du code de Visual C++ 6.0 vers Visual C++ 2005
Démarrer avec les MFC sous Visual C++1/2
la Faq Visual C++ 500 Q/R,Mon blog
Aide en Ligne MFC
Cours et tutoriels C++ - FAQ C++ - Forum C++.
et non, ça ne plante pas dans le SquareRoot
mieux encore, les références marchent a priori pour la fonction exportée analyse_spec (extern "C"). dans le prog appelant je teste le vecteur passé par référence et les données kil contient sont celles attendues (comme il nété pa initialisé avant l'appel, les données ne peuvent venir que du traitement par analyse_spec)
je perds mes repères là. dans les DLL c'est censé être exclusivement du C ou alors on peut faire du C et du C++ ?
d'autant que je peux utiliser les string dans les DLL (c'est du C++ ça)
Encore une connerie. En fait le extern C c'est juste pour éviter que le compilo C++ ne décore le nom de la fonction avec des symboles bizzares.Envoyé par abelman
On peut utiliser C et C++ dans les DLL. La référence devrait fonctionner aussi.
Fais voir le code stp.
au temps pour moi
ça marche avec les références dans mon SquareRoot. j'avais du faire une bêtise taleur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 EXPORT double SquareRoot(double d,vector<int> & v) { v.resize(1); v[0] = 10; if (d>=0.0) return sqrt(d); else return 0; }
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 void CRacine_carreDlg::OnCalcul() { // TODO: Add your control notification handler code here if (m_csPath!="") { typedef double (SQRTPROC)(double,std::vector<int>&); HINSTANCE hInstance; SQRTPROC * pSquareRoot; hInstance = LoadLibrary(m_csPath); pSquareRoot = (SQRTPROC*) GetProcAddress(hInstance,"SquareRoot"); UpdateData(TRUE); std::vector<int> v(1); v[0] = 3; m_dOutput = (*pSquareRoot)(m_dInput,v); UpdateData(FALSE); char buf[10]; AfxMessageBox(itoa(v[0],buf,10)); FreeLibrary(hInstance); } else AfxMessageBox("Choississez une DLL"); }
encore une question.
pourquoi est-ce que après FreeLibrary les données de mon vecteur sont perdues?
le message "toto" est affiché dnas ce cas. par contre si je mets le FreeLibrary après "toto", "toto" n'est pas affiché (le vecteur contient des données je peux faire vContrainte[0]->getnom() et récupérer l'info).
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
26
27
28
29
30
31
32
33
34
35 typedef void (ANALYSESPEC)(double,string,so_entite *,so_entite *,so_entite *,so_entite *,vector<int>,vector<int>,vector<int>,vector<so_contrainte*>&); HINSTANCE hInstance; ANALYSESPEC * pAS; hInstance = LoadLibrary("E:\\Utilisateurs\\Falola\\_SAUVEGARDES\\Analyse_Spec\\Release\\Analyse_Spec.dll"); vector<so_contrainte*> vContrainte(3); if (hInstance!=NULL) { pAS = (ANALYSESPEC*) GetProcAddress(hInstance,"analyse_spec"); if (!pAS) { FreeLibrary(hInstance); AfxMessageBox("erreur"); } else { vector<int> v1(14),v2(14),v3(14); for (int w=0;w<14;w++) { v1[w] = 100; v2[w] = 100; v3[w] = 100; } (*pAS)(1,"parallelisme",monEntite,monEntite,NULL,NULL,v1,v2,v3,vContrainte); AfxMessageBox(vContrainte[0]->getnom()); FreeLibrary(hInstance); } } if (vContrainte[0]==NULL) AfxMessageBox("toto");
normalement vContrainte devrait être conservé après FreeLibrary puisqu'il est déclaré dans le code appelant et que je l'ai passé par référence dans ma fonction exportée
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager