Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3177 connectés 

 


Dernière réponse
Sujet : [Win32/C/C++] Afficher les cartes de CARDS.DLL dans un DC
spark 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...

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
spark 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...

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)