DLL. Master 2 IF App. LEPSiS, INRETS/LCPC saunier@inrets.fr http://www.lamsade.dauphine.fr/~saunier. Julien Saunier



Documents pareils
Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Module.NET 3 Les Assemblys.NET

Systeme d'exploitation

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

PROGRAMMATION EVENEMENTIELLE sur EXCEL

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Cours d initiation à la programmation en C++ Johann Cuenin

Une introduction à Java

Convers3 Documentation version Par Eric DAVID : vtopo@free.fr

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Comment créer et utiliser une fonction

Rapport de Mini-Projet en ArcGIS Engine

as Architecture des Systèmes d Information

Ce document décrit la démarche à suivre pour installer les outils de développement et compiler le projet TANAGRA.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Le langage C. Séance n 4

Plan du cours. Historique du langage Nouveautés de Java 7

Excel. Identification. Informations sur vos besoins et objectifs. Notions fondamentales. Fiche de validation des besoins en formation Bureautique

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Formation VBA 3 Interagir

Guide d'installation. Release Management pour Visual Studio 2013

Utilitaires méconnus de StrataFrame

Bases Java - Eclipse / Netbeans

TP1. Outils Java Eléments de correction

Création d objet imbriqué sous PowerShell.

Installation et compilation de gnurbs sous Windows

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Programmer en JAVA. par Tama

Le hub d entreprise est une application de déploiement des applications mais aussi un outil de communication

Programme Compte bancaire (code)

Cours d Algorithmique et de Langage C v 3.0

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework


Visual Basic for Applications

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à Eclipse

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

1 TD 2 : Construction d'une chier Acrobat et envoi par

Java Licence Professionnelle CISII,

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Généralités sur le Langage Java et éléments syntaxiques.

Java Licence Professionnelle CISII,

et Programmation Objet

Préparer la synchronisation d'annuaires

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Notions fondamentales du langage C# Version 1.0

Visual Basic.NET Interaction avec Excel

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Sélection du contrôleur

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Chapitre 2. Classes et objets

WINDOWS SHAREPOINT SERVICES 2007

wxwidgets dans un environnement Microsoft Windows

.NET - Classe de Log

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Programmation en C/C++

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Quelques éléments de compilation en C et makefiles

Corrigé de l'atelier pratique du module 8 : Implémentation de la réplication

Construire une application marketing Facebook sur la plateforme Windows Azure

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Chapitre 10. Les interfaces Comparable et Comparator 1

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Conventions d écriture et outils de mise au point

Migration du pack office Planification, préparation, déploiement et formation

Introduction à l héritage en C++

TP1 : Initiation à Java et Eclipse

Bases de programmation. Cours 5. Structurer les données

Claude Delannoy. 3 e édition C++

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Algorithmique et programmation : les bases (VBA) Corrigé

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Introduction à l algorithmique et à la programmation M1102 CM n 3

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Programmation en Java IUT GEII (MC-II1) 1

Préconisations Portail clients SIGMA

Programmation C++ (débutant)/instructions for, while et do...while

Whitepaper. Méthodologie de création de rapports personnalisés SQL Server Reporting Services

Note de cours. Introduction à Excel 2007

Programmation impérative

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Construire des plug-ins pour SAS Management Console SAS 9.1

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Sébastien Sougnez 24/12/ / s.sougnez@areaprog.com 2 ans et demi d expérience

Cours 1: Java et les objets

TwinCAT 3 C++ Création de modules C++ sous TwinCAT 3 VERSION : 1.0 / PH

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Configuration requise pour l utilisation de la plateforme EnlightKS Online Certification Management Services ET2.13 Juin 2011

Comment créer des rapports de test professionnels sous LabVIEW? NIDays 2002

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

INITIATION AU LANGAGE JAVA

Création d installateurs pour Windows avec InnoSetup

Initiation à JAVA et à la programmation objet.

Auto-évaluation Programmation en Java

Transcription:

DLL Master 2 IF App Julien Saunier LEPSiS, INRETS/LCPC saunier@inrets.fr http://www.lamsade.dauphine.fr/~saunier

Dlls: Qu'est-ce? Objectifs Vue d'ensemble C/C++/C# Comment les utiliser depuis VBA/Excel? Comment créer une DLL (C++) Comment utiliser une DLL (VBA)

DLL: Dynamic Link Library Un module exécutable contenant des fonctions utilisable par d'autres applications Chargé une seule fois, quel que soit le nombre de programmes l'utilisant Liée statiquement ou dynamiquement Pouvant être mis à jour indépendamment des programmes l'utilisant Etant une boîte noire (confidentialité)

DLL: Dynamic Link Library A la racine du système Microsoft Windows De nombreuses DLL existent...... Mais sont souvent très mal documentées! Nécessite la connaissance de l'interface «Dll Hell», des conflits mal gérés: Instances multiples Versionnage

Processus général Lien statique Code source DLL Compilation DLL Interface (import library) Code source Application Compilation Executable

Processus général lien dynamique Code source DLL Compilation DLL Interface (import library) Appel dynamique Code source Application Compilation Executable

Et plus spécifiquement? C++: Possibilité de créer des DLL Possibilité d'utiliser des DLL VB(A): Statiquement Dynamiquement Possibilité d'utiliser des DLL dynamiquement Autres languages: Delphi, dbase...

Et plus spécifiquement? (2) Quand créer une librairie? Quand on veux utiliser des fonctions C++ depuis VBA Pour séparer son code c++ en modules indépendants

Créer une DLL Plusieurs méthodes existent, plus ou moins liées à l'environnement de développement Méthode commune à Visual C++ et GCC De nombreux problèmes se posent en cas d'accès concurrents! Eviter les variables globales

Créer une DLL Structure de fichiers classique Fichier.cpp Inclut le.h Contient les fonctions Pas de différence dans l'implémentation des fonctions Fichier.h Doit inclure la bibliothèque <windows.h> Contient les déclarations de fonctions Différencie les fonctions appelable de l'exterieur de la DLL des autres Contient la fonction de point d'entrée de la DLL

Visual C++ Créer un nouveau projet de type Win32 Dynamic Link Library Choisir un projet de type «Empty project» Créer 3 fichiers : nom_fichier.h : contenant les inclusions de bibliothèques (au minimum la bibliothèque standard et windows.h) et la définition des fonctions de la bibliothèque Nom_fichier.cpp : fichiers contenant le corps des fonctions (et incluant le fichier nom_fichier.h) Nom_fichier.def: fichier de définition de module pour définir les fonctions du.cpp exportées (i.e. utilisables par d autres programmes)

Exemple addition.cpp: #include "addition.h" double _stdcall ajouter(double a, double b){ return a+b; } double _stdcall oter(double a, double b){ return a-b; } /* int main(void){ } */

Exemple addition.h: #include <windows.h> extern "C" _declspec(dllexport) double _stdcall ajouter(double a, double b); extern "C" _declspec(dllexport) double _stdcall oter(double a, double b); BOOL APIENTRY DllMain( HANDLE hmodule, DWORD ul_reason_for_call, LPVOID lpreserved){ return TRUE; }

DllMain BOOL WINAPI DllMain (HANDLE hdll, DWORD dwreason, LPVOID lpreserved) { switch (dwreason) { case DLL_PROCESS_ATTACH: // Code to run when the DLL is loaded break; case DLL_PROCESS_DETACH: // Code to run when the DLL is freed break; case DLL_THREAD_ATTACH: // Code to run when a thread is created during the DLL's lifetime break; } case DLL_THREAD_DETACH: // Code to run when a thread ends normally. break; } return TRUE;

Compilation Dev-C++: Déclarer les fonctions de type _stdcall dans le header (mais pas nécessairement dans le.cpp) Visual C++: Déclarer les fonctions de type _stdcall dans le.h Déclarer les fonctions de type _stdcall dans le.cpp OU ajouter l'option de compilation /Gz dans le menu "Project->Project Settings->Onglet C/C++- >Case Project Options", ajouter Exporter suivant un fichier.def: LIBRARY addition EXPORTS ajouter oter

Visual C++ Vérifier dans le menu «éditeur de liens entrées fichier de définition de module» que votre.def est bien spécifié Le fichier.def permet d'éviter les problèmes de décoration des noms. int stdcall MyFunc (int a, double b) : _MyFunc@12 void stdcall InitCode (void) : _InitCode@0

Résultat Fichiers générés : Nom_Dll.dll : fichier de la bibliothèque dynamique Nom_Dll.lib : fichier permettant de faire la liaison avec la bibliothèque (i.e. pour qu un programme puisse accéder aux fonctions de la bibliothèques) Possibilité de lier la bibliothèque au programme C++ l utilisant : De manière statique : déclaration explicite dans le programme (via #include) et résolution de liens effectuée par l'éditeur de lien au moment de la phase de compilation du programme De manière dynamique : demande explicite du chargement d'une bibliothèque durant l exécution du programme Sous linux : bibliothèque dynamique d extension.so

Appeler une librairie (dynamique) typedef double (_stdcall *importfunction)(double, double); int main(void){ importfunction ajouter; double r=5,d=7,result; HINSTANCE hinstlib = LoadLibrary("addition.dll"); // Load DLL } // Get function pointer ajouter = (importfunction)getprocaddress(hinstlib, "ajouter"); // Call function. result = ajouter(r, d); // Unload DLL file FreeLibrary(hinstLib); printf("%f",result);

Ne pas oublier de tester! if (hinstlib == NULL) { printf("error: unable to load DLL\n"); return 1; } if (ajouter == NULL) { printf("error: unable to find DLL function\n"); return 1; }

Utiliser la DLL depuis Excel Créer ou ouvrir un classeur Excel Ouvrir l'éditeur VBA (alt F11) Ecrire dans le module pour chaque fonction de la DLL devant être utilisée dans le fichier Excel, une commande VBA de la forme : Private Declare Function NomFonction Lib "C:\Chemin_d_acces\NomDll.dll" (arg1 As Type, arg2 as Type, ) As Type Ne pas oublier d'autoriser l'exécution des macros (Outils Macro Sécurité, sélectionner moyen ou faible, puis fermer et ouvrir Excel)

Appeler une librairie en VB(A) Declare Function ajouter Lib "addition.dll" (byval r As Double, Byval s As Double) As Double Sub Main Dim result As double Dim a As double, b as double a=5.5 b=4.2 result= ajouter(a,b) MsgBox result End Sub

Utiliser une fonction depuis Excel

Correspondances de type Type C/C++ INT UINT WORD BYTE CHAR CHAR* ADRESSE Equivalent Visual Basic LONG LONG INTEGER BYTE BYTE STRING LONG

Et les classes? Pas vraiment prévu pour VBA Possibilité de passer des structures C «Manager» les objets par le biais de fonctions

Structures struct DATA { short x; long y; double reel; } ; void _stdcall InitData (DATA * data) { data->x = 15; data->y = 52445; data->reel = 2459.65; }

Structures Private Type TDATA x As Integer y As Long reel As Double End Type Private Declare Sub InitData Lib "Fonctions.dll" (donnees As TDATA) Sub Test() Dim donnees As TDATA donnees.strvariable = Space(30) InitData donnees End Sub

Utiliser une classe via des fonctions #include <iostream> #include <windows.h> using namespace std; class ClasseDynamique { public: _declspec(dllexport) ClasseDynamique(); _declspec(dllexport) ~ClasseDynamique(); void _declspec(dllexport) SetAttribut(int a); int _declspec(dllexport) GetAttribut(); void _declspec(dllexport) Afficher(); private: int attribut; }; ClasseDynamique::ClasseDynamique() { attribut=0; } ClasseDynamique::~ClasseDynamique() {} int ClasseDynamique::GetAttribut() { return attribut; } void ClasseDynamique::SetAttribut(int a) { attribut=a; } void ClasseDynamique::Afficher() { cout << "attribut=" << attribut << endl; } Exemple repris de Maude Manouvrier, Univ. Paris-Dauphine

Utiliser une classe via des fonctions Pour utiliser une classe de DLL C++ dans un programme VBA : Définir dans la DLL C++ des fonctions manipulant les objets de la classe via des pointeurs en les définissant avec _stdcall Exporter ces fonctions dans le.def Utiliser ces fonctions dans des modules VBA extern "C" _declspec(dllexport) ClasseDynamique * _stdcall ClasseDynamique_Constr(); extern "C" declspec(dllexport) int stdcall ClasseDynamique_Destr(ClasseDynamique* Objet); extern "C" _declspec(dllexport) int _stdcall ClasseDynamique_SetAttribut(ClasseDynamique* Objet, int a); extern "C" _declspec(dllexport) int _stdcall ClasseDynamique_GetAttribut(ClasseDynamique* Objet); Exemple repris de Maude Manouvrier, Univ. Paris-Dauphine

Utiliser une classe via des fonctions ClasseDynamique * _stdcall ClasseDynamique_Constr() { return (new ClasseDynamique); } // retourne l adresse int _stdcall ClasseDynamique_Destr(ClasseDynamique* Objet) { delete Objet; // supprime l objet return 1; } int _stdcall ClasseDynamique_SetAttribut (ClasseDynamique* Objet int a) { Objet->SetAttribut(a); Return 1; } int _stdcall ClasseDynamique_GetAttribut(ClasseDynamique* Objet) { return Objet->GetAttribut(); } Exemple repris de Maude Manouvrier, Univ. Paris-Dauphine

Utiliser une classe via des fonctions Declare Function ClasseDynamique_Constr Lib "MaDll.dll" () As Long Declare Function ClasseDynamique_Destr Lib "MaDll.dll" _ (ByVal Adresse As Long) As Long Declare Function ClasseDynamique_SetAttribut Lib "MaDll.dll" _ (ByVal Adresse As Long, ByVal a As Long) As Long Declare Function ClasseDynamique_GetAttribut Lib "MaDll.dll" _ (ByVal Adresse As Long) As Long Sub Main() Dim Adresse As Long, r As Double Dim a As Integer, result As Long a = 4 Adresse = ClasseDynamique_Constr() MsgBox ("Nouvel objet instancié à l'adresse : " & Adresse) result = ClasseDynamique_SetAttribut(Adresse, a) MsgBox (a & " a été affecté à l'objet " & Adresse) result = ClasseDynamique_GetAttribut(Adresse) MsgBox ("L'objet a pour valeur " & result) End Sub Exemple repris de Maude Manouvrier, Univ. Paris-Dauphine

Appeler une librairie (statique) Créer une «import library» à partir de votre dll: Créer un fichier de définition.def Exporter la dll en librairie avec dlltool -D addition.dll --def addition.def --output-lib libaddition.a Sous Visual Studio, déclarer l'emplacement du.h, du.lib et de la dll. Utiliser la bibliothèque dans votre programme: #include <windows.h> extern "C" _declspec(dllimport) double ajouter(double a, double b); extern "C" _declspec(dllimport) double oter(double a, double b);

#include "toto.h" int main(void){ double r=5,d=7; printf("%f",ajouter(r,d)); } Appeler une librairie (statique) Compiler le projet g++ -o toto toto.cpp -L./ -l libaddition ou g++ -o toto toto.cpp addition.dll

XLL add-ins Un add-in (xll) est une dll particulière Compatible avec les callbacks excel Pouvant utiliser des commandes excel dans le code C/C++ via une interface Il faut télécharger le kit de développement Excel 97 SDK (jusqu'à Office 2003) Excel 2007 SDK (versions supérieures)

En pratique... Copier dans le répertoire du projet ou déclarer les liens vers les fichiers xlcall.h et Xlcall32.lib Contient au moins une fonction xlautoopen Appelée au chargement de l'add-in Permet d'inscrire les fonctions de la bibliothèque automatiquement Pour plus de renseignements, voir http://msdn.microsoft.com (Developing Add-ins (XLLs) in Excel 2007) et http://support.microsoft.com/kb/178474

C# Passage de la dll par une interface COM Possibilité d'utiliser les objets directement Créer un projet «Class Library» Selectionner Project Properties Build Register for COM interop Compiler le projet nom.dll: bibliothèque nom.tlb: bibliothèque de type, nécessaire au client COM Exposer la bibliothèque: gacutil /i nom.dll

Exemple Exposer les éléments via une interface Obtenir un GUID (C:\Program Files (x86)\microsoft SDKs\Windows\v7.0A\bin\guidgen.exe, obtenir via tools External tools) Exposer le composant COM

Exemple using System.Runtime.InteropServices; namespace Addition { [InterfaceType(ComInterfaceType.InterfaceIsDual)] [Guid("447B7FFB-59BF-4015-832C-FC620ED18935")]//Allocate GUID public interface _addition{ double ajouter(double a, double b); } [ClassInterface(ClassInterfaceType.None)] [Guid("F34CA20F-24B7-4b2f-A349-5FA9F5D15228")] [ComVisible(true)] public class Util : _addition { public Util() { } public double ajouter(double a, double b){ return a+b; } } }

Depuis VBA Référencer la bibliothèque par Tools References Sub main() Dim o: Set o = CreateObject("Addition.util") MsgBox o.ajouter(3.2, 4.5) End Sub