// Recuperation de l'adresse de la fonction de fin d'utilisation fptr = (TerminatePtr) GetProcAddress(m_hDllInstance, "cdtTerm" );
if( fptr != NULL) { // Appel de la fonction de la DLL fptr(); }
// On libère la DLL de la mémoire FreeLibrary(m_hDllInstance); } }
void Card::Render_Card(HDC hDC, int x, int y, int CardNumber) { if( m_hDllInstance != NULL ) { DrawPtr fptr;
//Recuperation de l'adresse de la fonction de dessin fptr = (DrawPtr) GetProcAddress(m_hDllInstance, "cdtDraw" );
if( fptr != NULL) { int Ret; Ret = fptr(hDC, x, y, CardNumber, 0, GetBkColor(hDC)); } } }
Et Forcément, ca marche pas du tout.... on s'en serait douté. J'ai peut etre rien compris aux pointeurs de fonctions parce que c des que je veux appeller la fonction pointée que ca plante.
Pour info, je me suis basé sur un truc VB et la déclaration des fonctions de la dll est la suivante :
Declare Function cdtInit Lib "Cards.Dll" (dX As Long, dY As Long) As Long Declare Function cdtDraw Lib "Cards.Dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal iCard As Long, ByVal iDraw As Long, ByVal clr As Long) As Long Declare Function cdtTerm Lib "Cards.Dll" () As Long
Marsh Posté le 15-01-2002 à 20:37:24
Je dois faire un jeu de cartes et j'ai donc pensé à utiliser la dll CARDS.DLL qui contient un jeu de cartes et les fonctions pour les afficher.
J'ai donc commencé ma p'tite classe Card dont voici le code:
Card.h:
class Card
{
private:
HINSTANCE m_hDllInstance;
typedef void (*InitializePtr)(int, int);
typedef int (*DrawPtr)(HDC, int, int, int, int, int);
typedef void (*TerminatePtr)(void);
public:
Card();
virtual ~Card();
void Render_Card(HDC, int, int, int);
};
Card.cpp:
#include "Card.h"
Card::Card()
{
// On charge la DLL des cartes en mémoire
m_hDllInstance = LoadLibrary("CARDS.DLL" );
if( m_hDllInstance != NULL )
{
InitializePtr fptr;
// On recupere un pointeur sur la fonction d'initlisation de la DLL
fptr = (InitializePtr) GetProcAddress( m_hDllInstance, "cdtInit" );
if( fptr != NULL)
{
int Width, Height;
MessageBox(NULL,"Coucou","",MB_OK);
// Appel de la fonction de la DLL
fptr(Width, Height);
}
}
}
Card::~Card()
{
if( m_hDllInstance != NULL )
{
TerminatePtr fptr;
// Recuperation de l'adresse de la fonction de fin d'utilisation
fptr = (TerminatePtr) GetProcAddress(m_hDllInstance, "cdtTerm" );
if( fptr != NULL)
{
// Appel de la fonction de la DLL
fptr();
}
// On libère la DLL de la mémoire
FreeLibrary(m_hDllInstance);
}
}
void Card::Render_Card(HDC hDC, int x, int y, int CardNumber)
{
if( m_hDllInstance != NULL )
{
DrawPtr fptr;
//Recuperation de l'adresse de la fonction de dessin
fptr = (DrawPtr) GetProcAddress(m_hDllInstance, "cdtDraw" );
if( fptr != NULL)
{
int Ret;
Ret = fptr(hDC, x, y, CardNumber, 0, GetBkColor(hDC));
}
}
}
Et Forcément, ca marche pas du tout.... on s'en serait douté.
J'ai peut etre rien compris aux pointeurs de fonctions parce que c des que je veux appeller la fonction pointée que ca plante.
Pour info, je me suis basé sur un truc VB et la déclaration des fonctions de la dll est la suivante :
Declare Function cdtInit Lib "Cards.Dll" (dX As Long, dY As Long) As Long
Declare Function cdtDraw Lib "Cards.Dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal iCard As Long, ByVal iDraw As Long, ByVal clr As Long) As Long
Declare Function cdtTerm Lib "Cards.Dll" () As Long
Merci à celui qui trouvera ce qui foire...