Comment utiliser une DLL tiers ?

Signaler
Messages postés
2
Date d'inscription
jeudi 10 avril 2003
Statut
Membre
Dernière intervention
11 avril 2003
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
Bonjour a tous,

QUESTIONS :
- Comment utiliser les classes, varaibles, constantes et fonctions dans une DLL sous VC++?
- Est-ce t'il existe un tutoriel simple et précis (je ne suis pas expert!!) qui puisse me guider?
- Est-ce que quelqu'un à un exemple de code simple qui montre comment faire?
- Je suis pret à prendre un tut en anglais (ma copine me le traduira si necessaire!)

En effet, je voudrais piloter un appareil. Je ne dispose que de la DLL, du .H mais pas d .LIB .
Cette DLL contient l'ensemble des classes, variables et fonctions qui sont necessaire au pilotage de cet appareil. Je ne dispose d'aucune doc autre que le header (et encore il est en japonnais!!)

Je sais que la question a très certainement été mainte fois aborté, mais je ne trouve pas de solution. On m'a bien filé les MSDNs en me disant que tout était dedans, mais ne parlant que très sommairement anglais, c'est une véritable galère pour trouver ce que je cherche.

Lors de mes recherches, chaque fois que l'on parle d'utiliser les fonctions d'une DLL, il faut disposer du Header, de la DLL et du .LIB (et c'est là que le bas blesse!!)

VieuxLion a écrit un article interessant sur les plugins, mais ce n'est pas ce que je cherche. (http://www.cppfrance.com/article.aspx?Val=1400).
Il y a aussi cette fameux post de Xs : CREER et UTILISER des DLLs (http://www.cppfrance.com/article.aspx?Val=871), mais là aussi la question reste en suspend quant à l'utilisation de DLLs externes.

PS : Pour des raisons de compatibilité, je dois utiliser Visual C++ 6.0.

STEF

1 réponse

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Les constantes n'existe pas dans les DLL.

Pour utilise des variables tu peux passer par des fonctions:
type getVar() et void setVar(type val)

tu peux aussi les exporter:
type __declspec(dllexport) var;

et pour l'importer:
type __declspec(dllimport) var;

pour les fonctions:
type __declspec(dllexport) f(type v);
type __declspec(dllimport) f(type v);

pour les classes:
__declspec(dllexport) class {...};
__declspec(dllimport) class {...};

Si tu n'a pas de .lib il faut utiliser l'API Windows:
pour importer une fonction c'est: GetProcAddress
mais il faut d'abord charget la DLL avec LoadLibrary

Sache que dans les DLL les variables sont partagé ainsi chaque instance qui importe la DLL rique de commetre des effets de bord.

Voici un bout de source que j'ai fait pour quelqu'un:
// k8d.cpp : Defines the entry point for the DLL application.
//

#include <stdio.h>
#include "stdafx.h"

static HINSTANCE ghInstance;
static bool gbLibraryLoaded= false;

int (*LitIOdata)(int i);
int (*LitIO)(int i);

/*RADIX CONVERSION FUNCTIONS*/
void (*DecToBin)(int DecNumber, char *Bin);
int (*BintoDec)(char *BinNumber);
void (*DecToHex)(int DecNumber, char *Hex);
int (*HexToDec)(char *HexNumber);

/*IO CONFIGURATION PROCEDURES*/
void (*ConfigAllIOasInput)(void);
void (*ConfigAllIOasOutput)(void);
void (*ConfigIOchipAsInput)(int Chip_no);
void (*ConfigIOchipAsOutput)(int Chip_no);
void (*ConfigIOchannelAsInput)(int Channel_no);
void (*ConfigIOchannelAsOutput)(int Channel_no);

/*UPDATE IOdata & IO ARRAY PROCEDURES*/
void (*UpdateIOdataArray)(int Chip_no, int Data);
void (*ClearIOdataArray)(int Chip_no);
void (*SetIOdataArray)(int Chip_no);
void (*SetIOchArray)(int Channel_no);
void (*ClearIOchArray)(int Channel_no);

/*OUTPUT PROCEDURES*/
void (*IOoutput)(int Chip_no, int Data);
void (*UpdateAllIO)(void);
void (*ClearAllIO)(void);
void (*SetAllIO)(void);
void (*UpdateIOchip)(int Chip_no);
void (*ClearIOchip)(int Chip_no);
void (*SetIOchip)(int Chip_no);
void (*SetIOchannel)(int Channel_no);
void (*ClearIOchannel)(int Channel_no);

/*INPUT PROCEDURES*/
void (*ReadIOchip)(int Chip_no);
void (*ReadAllIO)(void);
void (*ReadIOchannel)(int Channel_no);

/*6 BIT DAC CONVERTER PROCEDURES*/
void (*OutputDACchannel)(int Channel_no, int Data);
void (*UpdateDACchannel)(int Channel_no);
void (*ClearDACchannel)(int Channel_no);
void (*SetDACchannel)(int Channel_no);
void (*UpdateDACchip)(int Chip_no);
void (*ClearDACchip)(int Chip_no);
void (*SetDACchip)(int Chip_no);
void (*UpdateAllDAC)(void);
void (*ClearAllDAC)(void);
void (*SetAllDAC)(void);

/*8 BIT DA CONVERTER PROCEDURES*/
void (*OutputDAchannel)(int Channel_no, int Data);
void (*UpdateDAchannel)(int Channel_no);
void (*ClearDAchannel)(int Channel_no);
void (*SetDAchannel)(int Channel_no);
void (*UpdateAllDA)(void);
void (*ClearAllDA)(void);
void (*SetAllDA)(void);

/*8 BIT AD CONVERTER PROCEDURES*/
void (*ReadADchannel)(int Channel_no);
void (*ReadADchip)(int Chip_no);
void (*ReadAllAD)(void);

/*GENERAL PROCEDURES*/
void (*ReadAll)(void);
void (*ReadCard)(int Card_no);
void (*UpdateAll)(void);
void (*UpdateCard)(int Card_no);

/*I2C BUS CONDITIONS*/
void (*SelectI2CprinterPort)(int Printer_no);
void (*I2CBusNotBusy)(void);

bool _LoadDLLFunction(LPCTSTR name, FARPROC &function)
{
function= GetProcAddress(ghInstance, name);

if( !function )
{
char message[500];

sprintf(message, "La fonction '%s' n'a pas pu être chargée à partir de la DLL", name);
MessageBox(NULL, message, "Fonction non trouvée", MB_ICONERROR);
}

return ( function )?true:false;
}

#define LoadDLLFunction(name) _LoadDLLFunction(#name, (FARPROC &)name)

BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if( !gbLibraryLoaded )
{
ghInstance= LoadLibrary(".\\K8000.dll");

if( ghInstance )
{
if( LoadDLLFunction(LitIOdata)
&& LoadDLLFunction(LitIO)
&& LoadDLLFunction(DecToBin)
&& LoadDLLFunction(BintoDec)
&& LoadDLLFunction(DecToHex)
&& LoadDLLFunction(HexToDec)
&& LoadDLLFunction(ConfigAllIOasInput)
&& LoadDLLFunction(ConfigAllIOasOutput)
&& LoadDLLFunction(ConfigIOchipAsInput)
&& LoadDLLFunction(ConfigIOchipAsOutput)
&& LoadDLLFunction(ConfigIOchannelAsInput)
&& LoadDLLFunction(ConfigIOchannelAsOutput)
&& LoadDLLFunction(UpdateIOdataArray)
&& LoadDLLFunction(ClearIOdataArray)
&& LoadDLLFunction(SetIOdataArray)
&& LoadDLLFunction(SetIOchArray)
&& LoadDLLFunction(ClearIOchArray)
&& LoadDLLFunction(IOoutput)
&& LoadDLLFunction(UpdateAllIO)
&& LoadDLLFunction(ClearAllIO)
&& LoadDLLFunction(SetAllIO)
&& LoadDLLFunction(UpdateIOchip)
&& LoadDLLFunction(ClearIOchip)
&& LoadDLLFunction(SetIOchip)
&& LoadDLLFunction(SetIOchannel)
&& LoadDLLFunction(ClearIOchannel)
&& LoadDLLFunction(ReadIOchip)
&& LoadDLLFunction(ReadAllIO)
&& LoadDLLFunction(ReadIOchannel)
&& LoadDLLFunction(OutputDACchannel)
&& LoadDLLFunction(UpdateDACchannel)
&& LoadDLLFunction(ClearDACchannel)
&& LoadDLLFunction(SetDACchannel)
&& LoadDLLFunction(UpdateDACchip)
&& LoadDLLFunction(ClearDACchip)
&& LoadDLLFunction(SetDACchip)
&& LoadDLLFunction(UpdateAllDAC)
&& LoadDLLFunction(ClearAllDAC)
&& LoadDLLFunction(SetAllDAC)
&& LoadDLLFunction(OutputDAchannel)
&& LoadDLLFunction(UpdateDAchannel)
&& LoadDLLFunction(ClearDAchannel)
&& LoadDLLFunction(SetDAchannel)
&& LoadDLLFunction(UpdateAllDA)
&& LoadDLLFunction(ClearAllDA)
&& LoadDLLFunction(SetAllDA)
&& LoadDLLFunction(ReadADchannel)
&& LoadDLLFunction(ReadADchip)
&& LoadDLLFunction(ReadAllAD)
&& LoadDLLFunction(ReadAll)
&& LoadDLLFunction(ReadCard)
&& LoadDLLFunction(UpdateAll)
&& LoadDLLFunction(UpdateCard)
&& LoadDLLFunction(SelectI2CprinterPort)
&& LoadDLLFunction(I2CBusNotBusy) )
gbLibraryLoaded= true;
else
{
FreeLibrary(ghInstance);
return FALSE;
}
}
}
break;

case DLL_PROCESS_DETACH:
if( gbLibraryLoaded )
if( FreeLibrary(ghInstance) )
gbLibraryLoaded= false;
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

return TRUE;
}

Si tu veux, passe moi le source qui utilise la DLL, et les fichiers à metaos@free.fr et je te ferais la liaison avec la DLL.

Core Breaker :)