Vous êtes sur la page 1sur 13

Intgration de code C++ et C dans Excel

Crer une DLL


Pour crer une nouvelle librairie dynamique, il faut : Crer un projet C++, avec type DLL Inclure le projet dans une solution Pour accder aux fonction de la DLL il faut connatre le

nom sous lequel elles sont exportes : linterface de la DLL. Excel ne peut accder que des fonction qui traitent des paramtres et retourne des valeurs de types reconnus. Excel ne peut pas accder directement des classes.

Vrifier linterface dune DLL avec Dependency walker

Arborescence de dpendances Interface

Hello World en Excel/C++


Fichier HelloWorld.cpp
#include <wtypes.h> #include <string.h> BSTR __stdcall cHello(void) { char *mess="Hello World"; BSTR ret=SysAllocStringByteLen(mess,strlen(mess)); return ret; }

Dfinition de linterface
Fichier HelloWorld.def

LIBRARYHelloWorld EXPORTS cHello

Instruction Declare en VBA


Le code C++ doit tre compil et distribu dans une

librairie dynamique (DLL). On ne peut accder que aux fonctions qui ont t exportes par le crateur de la DLL.
Declare Function cHello Lib "HelloWorld.dll" () As String Function Hello() As String Hello = cHello() End Function

Passage de paramtres
On peut passer des donnes entre VBA et C++. Si une

variable est passe ByRef depuis VBA, alors en C++ le paramtre correspondant doit tre dclar comme pointeur. On peut passer un array de VBA vers C++ en passant par rfrence le premier lment dun tableau de taille suffisante. On peut aussi utiliser le type Variant de VBA et y inclure un tableau.

quivalence de Types
VBA Byte Boolean Integer Currency Single Double Date String Variant C++ unsigned char [signed] short [signed] [long] int CY (type de <wtypes.h> float double double DATE (type de <wtypes.h> BSTR (type de <wtypes.h> VARIANT (type de <oaidl.h>

Instruction Declare sous VBA


Pour accder une fonction C++ dans VBA on utilise

linstruction Declare. Deux syntaxes:


[Public|Private] Declare Sub name Lib libname [Alias

aliasname][([arglist])] [Public|Private] Declare Function name Lib libname [Alias aliasname] [([arglist])] [As Type]

Interface sans fichier def


On peut exporter des fonctions dune DLL sans avoir

recours un fichier def. Il est impratif de prcder chaque fonction dune directive
__declspec(dllexport)

Il est conseill de dbrancher la dcoration C++ en

utilisant la directive :
extern "C"

Appel dune DLL sans def depuis VBA


Deux possibilites: Reprer le nom dcor laide de Dependecy Walker. Reprer lordinal.
' Fonction declaree par ordinal Declare Function Get_nprime Lib "excel_demo.dll" Alias "#2" _ (ByVal n&) As Integer ' subroutine declaree par nom Declare Sub Get_allprime Lib "excel_demo.dll" Alias "_all_prime@12" _ (ByVal n&, ByRef sz&, ByRef pr_list&)

Ordinal et nom dcor

Nom dcor Ordinal

Vous aimerez peut-être aussi