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

LIBRARY
EXPORTS
cHello

HelloWorld

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

C++

Byte

unsigned char

Boolean

[signed] short

Integer

[signed] [long] int

Currency

CY (type de <wtypes.h>

Single

float

Double

double

Date

double
DATE (type de <wtypes.h>

String

BSTR (type de <wtypes.h>

Variant

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
Ordina
dcor
l

Vous aimerez peut-être aussi