DLL en C pour WinDev
Transcription
DLL en C pour WinDev
Grinchou -> * Le mardi 5 avril 2011 DLL en C pour WinDev Comment faire une DLL en langage C pour l'utiliser avec WinDev ? Pratique pour des types de traitement que le Wlangage ne permet pas encore, comme les serveurs COM et autres joyeusetés. J'exemple à partir du Visual Studio 6, mais le principe est identique avec les autres versions. Je ne parle pas de Borland/Inprise parce que les "mots-clés" de déclaration changent à chaque version. Alors zut! Ma méthode n'est sûrement pas la meilleure du monde, mais elle marche. Création du projet VC . "New", onglet "Project", puis "Win32 Dynamic-Link Library". . Lui donner un nom "MaDLL" et un répertoire "C:\tmp\MaDLL" Choisir ensuite "An empty DLL Project" 1/3 Grinchou -> * Le mardi 5 avril 2011 Le projet grossit Ensuite créer un nouveau "fichier C" (cliquer sur l'icône "nouveau") et taper ce code #include #include #include #include <windows.h> <stdio.h> <stdLib.h> <string.h> #include "src_main.h" protos de primitives. */ /* Déclaration des macros de substitution et des HINSTANCE ghDLL; /* Handle global de l'instance de la DLL */ // Primitive d'exemple. On lui passe une valeur de type Long, elle la renvoie! long __declspec(dllexport) JeTeste(long plValeur) { return plValeur; } int __declspec(dllexport) LEntier(int plValeur) { return plValeur; } int __declspec(dllexport) LeFloat(float pfValeur) { if (pfValeur == 12.5) return TRUE; return FALSE; } /* And The Troubles Began ..... */ BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID lpReserved) { switch(fdwReason) { case DLL_PROCESS_ATTACH: /* Chargement de la DLL: Initialisation */ ghDLL = hModule; break; case DLL_THREAD_ATTACH: /* Nouveau Thread de la DLL */ break; case DLL_PROCESS_DETACH: /* Le Processus se termine */ break; case DLL_THREAD_DETACH: /* Fin d'un Thread */ break; } return TRUE; } /* ..... That's All Folks! */ cliquer sur l'icône disquette et lui donner le nom "src_main.c" Ensuite créer un nouveau fichier en cliquant sur l'icône "Nouveau" et taper ce code // Fichier de description #include <assert.h> /* Variables globales */ extern HINSTANCE ghDLL; #define EXPORTATION __declspec(dllexport) long __declspec(dllexport) JeTeste(long plValeur); int __declspec(dllexport) LEntier(int plValeur); int __declspec(dllexport) LeFloat(float pfValeur); cliquer sur l'icône disquette et lui donner le nom "src_main.h". 2/3 Grinchou -> * Le mardi 5 avril 2011 Générer la DLL . "Build…Rebuild All" et la DLL est créée dans le répertoire "Debug" ou "Release" suivi ce qui a été paramétré dans "Project…Settings" Utiliser en WD Exemple de code lsDLLPath est chaîne lsPrimitiveNom est chaîne llEntrée est entier llArrivée est entier // Path de la DLL lsDLLPath = "C:\Langage C:\tmp\MaDLL\Debug\MaDLL.dll" // Nom de la primitive dans la DLL lsPrimitiveNom = "JeTeste" // Paramètre en entrée llEntrée = 12 // Exécution et récup du résultat llArrivée = AppelDLL32(lsDLLPath, lsPrimitiveNom, llEntrée) // Affichage du résultat Info(llArrivée) 3/3