Bonjour à tous,
Dans le cadre d'un projet de stage je dois programmer un wrapper pour LabVIEW. Avant de m'attaquer au gros du projet, j'ai voulu faire des tests concernant la création de DLLs, et plus précisément de DLLs utilisant des objets. Je ne suis pas informaticien, n'étudie pas l'informatique et n'ai jamais programmé un projet en C++. En tâtonnant je suis arrivé à faire fonctionner mon programme comme je le souhaite, donc de ce point de vue, pas de solution miracle à donner.
Cependant, ce fut du tâtonnement et certaines choses fonctionnent sans que je comprennent pourquoi. Il serait fort aimable si quelqu'un pouvait m'expliquer pourquoi.
Mon Projet inclut les fichiers suivants:
* stdafx.h (header contenant tous mes includes)
* targetver.h (crèè automatiquement, je ne l'ai pas touché)
* Object dummi.h (définition de mon objet)
* dllmain.cpp (le main de la dll. J'y ai juste ajouté la déclaration de mes fonctions)
* stdafx.cpp (encore une fois, un fichier vide contenant tous mes includes)
* ObjDef.def (un .def avec la liste des fonctions accessibles en appelant la DLL)
* Projet DLL C++.cpp (mon fichier principal avec mes fonctions. Je vais essayer de limiter mes questions à ce fichier).
Question 1: J'ai cru comprendre que extern "C" et __stdcall sont obligatoires. Que font ils et qu'apportent-ils à la fonction? Extern "C" restreint l'utilisation de certaines fonctions propres au C++ (les string par exemple, qui doivent être remplacés par des char*, sous peine de se prendre un warning et que les fonctions les utilisant ne fonctionnent pas une fois appelés depuis la DLL). Y-a-t-il une alternative?
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 // Projet DLL C++.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" extern "C" Dummi * __stdcall CreateObject(void) { Dummi dum; dum.Init(); // Initialisation des variables private de mon objet au cas où les fonctions read seraient lues avant d'être écrites return &dum; } extern "C" float __stdcall Addition(Dummi * d1, float a, float b) { return d1->Addieren(a, b); } extern "C" void __stdcall GiveName(Dummi * d1) // fonction pour tenter d'écrire dans le private de mon objet { d1->Setname("myobject"); } extern "C" char * __stdcall GetName(Dummi * d1) // fonction pour lire dans le private de mon objet { return d1->Getname(); } extern "C" void __stdcall GiveVal(Dummi * d1, float a) // fonction pour tenter d'écrire dans le private de mon objet { d1->Setvalue(a); } extern "C" float __stdcall GetVal(Dummi * d1) )// fonction pour lire dans le private de mon objet { return d1->Getvalue(); }
Question 2: Ligne 16, 21, 26, 31 et 36. Quand je fais référence à mon objet dans mes fonctions, je dois utiliser -> (par exemple d1->Getvalue();). d1.Getvalue(); et d1::Getvalue(); ne fonctionnent pas. Pourquoi et où se situe la différence entre -> . et ::
Question 3: Si l'interret de grouper ses includes dans un seul (stdafx.h) me parait logique, je ne vois pas l'intérêt de répéter l'opération dans stdafx.cpp . En quoi est-il conseillé de le faire.
J'utilise Vusual Studio 2010.
Merci d'avance
Partager