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