Comment créer des fonctions en C (dans des Dll standards) appelables depuis VB ?Les Dll, pourquoi faire ?Vous pouvez vouloir utiliser des Dll, souvent écrites dans d'autres langages que VB, pour diverses raisons telles qu'un besoin de performances ou pour une simple réutilisation de code existant. Par exemple, la fonction GetTickCount disponible dans la Dll Kernel32 peut être appelée et utilisée depuis un programme en VB avec une simple déclaration comme ceci : Private Declare Function GetTickCount Lib "kernel32" () As Long On peut aussi souhaiter écrire ses propres fonctions, dans ses propres Dll, et c'est ce que nous allons expliquer dans cet article; On supposera le langage C connu, l'article se concentrant sur la génération d'une Dll appelable depuis VB. Comment ça marche ?Le but de cet article est de donner un exemple complet (et concret!) de réalisation d'une fonction en langage C dans une Dll, puis de sa déclaration et utilisation dans un programme en VB. Cet article expose la méthode pour faire ceci en C, mais il est possible de faire la même chose avec n'importe quel autre langage (C++, Fortran, etc.) pour autant que celui-ci dispose d'un compilateur permettant de générer une Dll standard. Nous allons réaliser notre Dll avec Visual C++ 2005, Express Edition, essentiellement parce que celui-ci est téléchargeable gratuitement depuis le site de Microsoft, en suivant ce lien : Visual C++ 2005, Express Edition. Néanmoins, tout ce qui est expliqué ici est aisément transposable aux autres versions de Visual C++. Qui plus est, tout compilateur/environnement de développement capable de générer une Dll peut être utilisé. Réalisation de la DllDans cet article, nous allons implémenter une fonction très simple, permettant de déterminer si un nombre est pair ou non. Le projet de cet exemple se nomme "samplevb" et la fonction "IsNumberEven". Voici les étapes à suivre pour la création de la Dll :
#define export __declspec (Dllexport)
La directive __stdcall permet de faire en sorte que les fonctions de la Dll et les fonctions de VB utilisent les mêmes conventions pour le passage des arguments. Un effet secondaire de la directive __stdcall est de changer légèrement le nom des fonctions générées. Dans notre exemple, la fonction "IsNumberEven" va être exportée sous le nom "_IsNumberEven@4". Ceci s'appelle une décoration. Nous allons voir dans la suite de l'article comment récupérer ce nom et comment en tenir compte dans la déclaration.
Il ne reste plus qu'à générer la Dll : Générer->Générer "nom de la Dll" (ici, samplevb). Si tout s'est bien passé, le panneau de sortie (en bas de l'IDE) doit afficher : 1>samplevb - 0 erreur(s), 0 avertissement(s) Utilisation de la DllL'utilisation est très simple :
Option Explicit Redistribution et installationLors de la distribution ou de l'installation, il est bien sur nécessaire d'inclure la Dll et de spécifier un endroit pour elle-ci. Plusieurs endroits sont possibles, correspondants aux endroits ou Windows va chercher les Dll. Voici les endroits possibles : Dynamic-Link Libray Research Path.Comme votre Dll n'est pas une Dll système, le meilleur endroit est probablement le répertoire de l'application. Lors du développement, quand le programme est lancé depuis l'IDE, il faut un petit "truc" pour que le programme puisse trouver le chemin de la Dll : #Const DebugVersion = 1 Passage de paramètres et conversions de types entre C et VBLe sujet est trop vaste pour être traité ici in-extenso, d'autant qu'il existe de nombreux articles très complets sur le sujet, notamment celui-ci : API Win32. Vous trouverez aussi à la fin de cet article de nombreux liens traitant de cela en détail.
Pour aller plus loin...On trouve de très nombreux articles traitant de ce sujet, aussi bien chez Microsoft (MSDN LIbrary, KB) qu'ailleurs (Internet, Livres, etc.). Vous trouverez ici quelques liens très intéressants voire indispensables pour bien utiliser tout ceci :
|
Date de publication : 19 novembre 2006 Dernière modification : 19 novembre 2006 Rubriques : Divers Mots-clés : Dll, C, fonctions, declare, langage C, stdcall, extern |