Bonjour,
Je souhaiterais utiliser une DLL programmée en C++ pour l'utiliser avec Excel afin de réaliser quelques calculs lourds.
J'utilise Dev-Cpp 4.9.9.2, Excel 2003 et Visual Basic 6.0.
Cependant, je ne sais pas comment utiliser mes objets à travers la DLL. Je ne sais utiliser que des fonctions. D'ailleurs je vais expliquer comment je fais cela, si ça peut intéresser du monde ...
Mon fichier "maDLL.h" :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
# define EXPORT extern "C" DLLIMPORT __stdcall
EXPORT int getOne();
#endif /* _DLL_H_ */ |
Mon fichier "maDLL.cpp" :
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
| #include "MaDLL.h"
#include <windows.h>
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
int getOne() {
return 1;
} |
Je compile avec "--no-export-all-symbols --add-stdcall-alias" pour mon linker et "-DBUILDING_DLL=1" pour le compilo.
En VB je crée un module et j'ajoute :
Public Declare Function getOne Lib "maDLL.dll" () As Long
Note : en fait, j'ai mis le chemin complet vers ma DLL à la place de "maDLL.dll" parce que Excel ne la trouvait pas.
Je crée ensuite un CommandButton que j'appelle CBTest et j'ajoute dans la feuille :
1 2 3
| Private Sub CBTest_Click()
MsgBox getOne
End Sub |
En cliquant sur mon bouton, j'obtiens bien un message contenant "1". Cool ;-)
Enfin bon, on ne va pas très loin avec tout ça. Et puis c'est pas vraiment du C++. Moi je souhaiterais utiliser les méthodes de mes classes. Je donne un exemple simpliste :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| struct Interface {
virtual const int getX() = 0 const;
virtual const int setX(const int) = 0;
};
class Base : public Interface {
private :
int x;
public :
Base();
virtual ~Base();
virtual const int getX() const;
virtual const int setX(const int);
};
const int Base::getX() const {
return x;
}
const int Base::setX(const int _x) {
x = _x;
return 1;
} |
Mon problème est là, comment dois-je faire pour créer mon objet Base depuis Excel, lui assigner une valeur et la récupérer ?
Plus vicieux : comment faire si je souhaire récupérer une référence vers mon objet ? Par exemple, en remplaçant setX(int) de cette façon :
1 2 3 4
| Base& Base::setX(const int _x) {
x = _x;
return *this;
} |
Partager