13
Intégration de code C++ et C dans Excel

Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Embed Size (px)

Citation preview

Page 1: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Intégration de code C++ et C dans Excel

Page 2: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Créer une DLL

Pour créer une nouvelle librairie dynamique, il faut :Créer un projet C++, avec type DLLInclure le projet dans une solution

Pour accéder aux fonction de la DLL il faut connaître le nom sous lequel elles sont exportées : l’interface de la DLL.

Excel ne peut accéder que à des fonction qui traitent des paramètres et retourne des valeurs de types reconnus.

Excel ne peut pas accéder directement à des classes.

Page 3: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure
Page 4: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Vérifier l’interface d’une DLL avec Dependency walker

Arborescencede dépendances

Interface

Page 5: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Hello World en Excel/C++

#include <wtypes.h>#include <string.h>

BSTR __stdcall cHello(void){ char *mess="Hello World"; BSTR ret=SysAllocStringByteLen(mess,strlen(mess));

return ret;}

Fichier HelloWorld.cpp

Page 6: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Définition de l’interface

LIBRARY HelloWorldEXPORTScHello

Fichier HelloWorld.def

Page 7: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Instruction Declare en VBA

Le code C++ doit être compilé et distribué dans une librairie dynamique (DLL).

On ne peut accéder que aux fonctions qui ont été exportées par le créateur de la DLL.

Declare Function cHello Lib "HelloWorld.dll" () As String

Function Hello() As String Hello = cHello()End Function

Page 8: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Passage de paramètresOn peut passer des données entre VBA et C+

+. Si une variable est passée ByRef depuis VBA, alors en C++ le paramètre correspondant doit être déclaré comme pointeur.

On peut passer un array de VBA vers C++ en passant par référence le premier élément d’un tableau de taille suffisante.

On peut aussi utiliser le type Variant de VBA et y inclure un tableau.

Page 9: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Équivalence de TypesVBA C++

Byte unsigned char

Boolean [signed] short

Integer [signed] [long] int

Currency CY (type de <wtypes.h>

Single float

Double double

Date doubleDATE (type de <wtypes.h>

String BSTR (type de <wtypes.h>

Variant VARIANT (type de <oaidl.h>

Page 10: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Instruction Declare sous VBAPour accéder à une fonction C++ dans VBA

on utilise l’instruction 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]

Page 11: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Interface sans fichier defOn peut exporter des fonctions d’une DLL

sans avoir recours à un fichier def. Il est impératif de précéder chaque fonction

d’une directive __declspec(dllexport)

Il est conseillé de débrancher la décoration C++ en utilisant la directive :extern "C"

Page 12: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Appel d’une DLL sans def depuis VBA

Deux possibilitées:Repérer le nom décoré à l’aide de Dependecy Walker.Repérer l’ordinal.

' Fonction declaree par ordinalDeclare Function Get_nprime Lib "excel_demo.dll" Alias "#2" _ (ByVal n&) As Integer ' subroutine declaree par nomDeclare Sub Get_allprime Lib "excel_demo.dll" Alias "_all_prime@12" _ (ByVal n&, ByRef sz&, ByRef pr_list&)

Page 13: Intégration de code C++ et C dans Excel. Créer une DLL Pour créer une nouvelle librairie dynamique, il faut : Créer un projet C++, avec type DLL Inclure

Ordinal et nom décoré

Ordinal

Nom décoré