Bonjour,
Débutant en C++ et .NET, je teste actuellement le fonctionnement des dll et donc le paramétrage nécessaire afin d'exporter des fonctions et de les importers pour un executable.
J'ai donc repris l'exemple donné par MSDN, jusque là tout va bien, le code est natif tout fonctionne comme il faut.
J'ai donc essayé d'intégrer du code managé dans ma dll : une simple messagebox.
La dll compile tout va bien, mais lorsque je compile le programme utilisant la dll (le programme est en c++ natif) j'obtiens en résultat les erreurs suivantes:
Sachant que si j'active la prise en charge du CLR dans l'appli, j'ai en plus des erreurs LNK2028 sur les mêmes lignes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static void __cdecl MathFuncs::MyMathFuncs::affiche(void)" (?affiche@MyMathFuncs@MathFuncs@@SAXXZ) référencé dans la fonction _main 2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Divide(double,double)" (?Divide@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main 2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Multiply(double,double)" (?Multiply@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main 2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Subtract(double,double)" (?Subtract@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main 2>MyExecRefsDll.obj : error LNK2019: symbole externe non résolu "public: static double __cdecl MathFuncs::MyMathFuncs::Add(double,double)" (?Add@MyMathFuncs@MathFuncs@@SANNN@Z) référencé dans la fonction _main
Ci dessous le code de l’exécutable utilisant la dll:
Le header de la 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
26
27 // MyExecRefsDll.cpp // compile with: /EHsc /link MathFuncsDll.lib #include <iostream> #include "MathFuncsDll.h" using namespace std; using namespace MathFuncs; int main() { double a = 7.4; int b = 99; cout << "a + b = " << MathFuncs::MyMathFuncs::Add(a, b) << endl; cout << "a - b = " << MathFuncs::MyMathFuncs::Subtract(a, b) << endl; cout << "a * b = " << MathFuncs::MyMathFuncs::Multiply(a, b) << endl; cout << "a / b = " << MathFuncs::MyMathFuncs::Divide(a, b) << endl; MathFuncs::MyMathFuncs::affiche(); return 0; }
et le code source de la 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 // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public: // Returns a + b static __declspec(dllexport) double Add(double a, double b); // Returns a - b static __declspec(dllexport) double Subtract(double a, double b); // Returns a * b static __declspec(dllexport) double Multiply(double a, double b); // Returns a / b // Throws DivideByZeroException if b is 0 static __declspec(dllexport) double Divide(double a, double b); //test affichage messagebox static __declspec(dllexport) void affiche(); }; }
Ma question est donc, qu'ai-je fait de mal?
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
43
44
45
46
47
48
49 // MathFuncsDll.cpp // compile with: /EHsc /LD #include "MathFuncsDll.h" #include <stdexcept> #include <Windows.h> #using <mscorlib.dll> using namespace System; using namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a, double b) { return a + b; } double MyMathFuncs::Subtract(double a, double b) { return a - b; } double MyMathFuncs::Multiply(double a, double b) { return a * b; } double MyMathFuncs::Divide(double a, double b) { if (b == 0) { throw new invalid_argument("b cannot be zero!"); } return a / b; } void MyMathFuncs::affiche() { /*#pragma push_macro("MessageBox") #undef MessageBox*/ System::Windows::Forms::MessageBox::Show("Message"); /*#pragma pop_macro("MessageBox")*/ } }
Merci d'avance pour votre aide.
Partager