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" :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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" :

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
#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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

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
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Base& Base::setX(const int _x) {
    x = _x;
    return *this;
}