130 likes | 349 Views
Intégration Excel / C++. 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 le projet dans une solution
E N D
Intégration Excel / C++ 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 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.
Vérifier l’interface d’une DLL avec Dependencywalker Arborescence de dépendances Interface
Hello World en Excel/C++ Fichier HelloWorld.cpp #include <wtypes.h> #include <string.h> BSTR __stdcallcHello(void) { char *mess="Hello World"; BSTR ret=SysAllocStringByteLen(mess,strlen(mess)); return ret; }
Définition de l’interface Fichier HelloWorld.def LIBRARY HelloWorld EXPORTS cHello
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
Passage de paramètres • On 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.
Instruction Declare sous VBA • Pour 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]
Interface sans fichier def • On 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"
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. ' Fonctiondeclaree 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&, ByRefsz&, ByRefpr_list&)
Ordinal et nom décoré Nom décoré Ordinal