CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

import/export d'une classe avec 1 dll ?

News jeu

Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop

Voir
hack2
hack2
Niveau 5
06 novembre 2002 à 18:43:11

J´ai un petit bleme, je n´arrive pas à exporter une classe C++ et à la réutiliser dans un autre prog.

Pour des variables de base ou des fonctions C classiques il n´y a pas de pb mais pour les classes ou des types structurés ça ne marche pas.

Si quelqu´un sait comment exporter une classe ou un objet de cette classe à partir d´une dll, que celui se montre please car ça me fait bien chier pour le moment.

Ca doit être une histoire de syntaxe tout con encore une fois.
Merci d´avance à celui qui a la solution.

Kelios
Kelios
Niveau 8
06 novembre 2002 à 23:09:18

DE LA PROG? ICI? MIRACLE!

Je suis à ton service... ; P

La technique est relativement . .. complexe ou simple, dépendament de ton point de vue...

on doit d´abord insérer un

  1. define DllExport _delclspec( dllexport )

pour se simplifier l´existence... et alléger le code...

On se le rajoute avant la classe, comme:

class DllExport MaClasse
{ public:
MaClasse();
~MaClasse();
unsigned int MaisQuesqueJeFoutLaMoi;
UneAutreClasse AucuneIdee;
};

La situation est simple:

MaClasse est exportée. Elle peut être utilisée librement dans ma DLL, sans avoir à réécrire DllExport.
Toutes les méthodes et champs de ma classe sont exportés aussi, et réécrire un DllExport sur eux reviendrait à une erreur.

On a , aussi, pas à l´importer dans le header de la Dll, si je me rapelle bien...

Kelios
------
"Cherchez l´erreur(il y a surement quelquechose que j,ai oublié)"

hack2
hack2
Niveau 5
06 novembre 2002 à 23:58:03

Et tu la réutilises comment dans ton autre programme ?
Par ex j´ai ça dans mon . h de ma dll et le reste dans le . cpp

  1. ifdef BEZIER_EXPORTS
  2. define BEZIER_API __declspec(dllexport)
  3. else
  4. define BEZIER_API __declspec(dllimport)
  5. endif
  1. include "Courbe_Bezier.h"

class BEZIER_API Bezier
{
public:
Bezier();
virtual ~Bezier();

COURBEBEZIER GetCourbe();
private:
COURBEBEZIER Courbe;
};

Comment tu la réutilises dans un autre prog ?

__declspec(dllimport) class Bezier B; ? ??
__declspec(dllimport) Bezier B; ? ??
__declspec(dllimport) Bezier; ? ??
. ...???

Je n´arrive pas à la réutiliser.
Il y a que les classes et types structurés qui fonctionnenr pas, pour le reste tout baigne mais pour ça...

Par ex: dans mon . cpp

extern "C" __declspec(dllexport) int carre(int x)
{
return(x*x);
}

et dans le prog qui l´importe:

extern "C" __declspec(dllimport) int carre(int x);

int x = carre(3);

Ca, ça tourne sans pb mais pour une classe que neni.

Kelios
Kelios
Niveau 8
07 novembre 2002 à 01:12:54

Tu est bien sur de t´être mis ta lib dans le projet? (ca peut paraitre con de demander ca, mais on ne sait jamais ! )

Parce que si tu aurais oublié, ça expliquerait tout... enfin, je me comprend....

Kelios
------
"Erreur 417: Explication non complète"

hack2
hack2
Niveau 5
07 novembre 2002 à 02:13:21

pas de pb, j´utilise bien la lib générée pour linker mais...l´import ne marche pas.

Kelios
Kelios
Niveau 8
07 novembre 2002 à 02:26:50

Ah bah ça?

peut être qu´il faut le faire exporter ala C,

Extern "C" struct DllExport MaClass
{ . ..
}

(dans ce cas, essaie, et il ne faudrait pas oublier de typedef-er MaClass dans ton header de la dll...)

n,empêche que c´est sale de faire une dll... faut´ faire gaffe...

Kelios
------
"Attention, chute de code!"

hack2
hack2
Niveau 5
07 novembre 2002 à 05:17:08

c bon j´ai trouvé, c´était un truc tout con (de toute façon les merdes qui prennent souvent assez longtemps pour être trouver c´est toujours des oublis tout con)

Quel était mon oubli à la con? l´oubli de mon . h
dans mon programme appelant bien sûr.
Ca me bouffe de perdre du temps pour des conneries comme ça.

Au fait en quoi tu trouves que c´est sale de faire des dll ? ??

LcData
LcData
Niveau 6
07 novembre 2002 à 12:58:25

Ah une question inteligente

bon les autres on deja repondu mais si tu veux un exemple de code qui tourne va voir a cette adresse il y a un tutorial sur les dll

http://www.gametutorials..com/Tutorials/c++/Cpp_Pg7.htm

Data
http://www.ploksoftware.org

Kelios
Kelios
Niveau 8
08 novembre 2002 à 03:01:06

Ce que je trouve de sale avec les dll? tout le mal qu,on se donne pour finalement pas grand chose, a mon avis...

Et puis, cet horrible Extern "C"... brrr!

D,ailleurs, jamais compris, extern C t´OBLIGE-t-il à écrire du C, ou on peut écrire du C++ et le compi se chargera de te le ´C´-éer?

Faut dire que jusqua maintenant, j,ai toujours du faire du C sous extern C, mais j,ai jamais essayé du C++. Quelqun sait?

Kelios
------
"Une réponse entraine une question, et non pas l´inverse"

hack2
hack2
Niveau 5
08 novembre 2002 à 06:20:13

Apres avoir fait plein d´essais, si tu veux faire du c++ dans ta dll et exporter ta classe tu dois creer des fonctions qui vont interfacer ta classe et tu ne te serviras que de ces fonctions d´interface.

Par ex tu devras avoir une fonction qui appelera ton constructeur et qui renverra l´adresse de ton objet, des fonctions qui appeleront les fonctions de ta classe etc

le extern "C" tu t´en fous finalement.

hack2
hack2
Niveau 5
08 novembre 2002 à 06:30:50

petit ex detaillé vite fait:

----------------------
Dans la DLL: le . h
----------------------

  1. ifdef PRIMITIVES_EXPORTS
  2. define PRIMITIVES_API __declspec(dllexport)
  3. else
  4. define PRIMITIVES_API __declspec(dllimport)
  5. endif

class PRIMITIVES_API Toto
{
public:
Toto();
~Toto();

inline int Get() {return(i);}

private:
int i;
} T;

class PRIMITIVES_API Primitives
{
public:
Primitives(void);

inline Toto* Get() {return(&);}

private:
Toto T;

} P;

PRIMITIVES_API Toto* appel();
PRIMITIVES_API int Geti( Toto* objet );

-----------------------
le . cpp de la DLL
-----------------------

  1. include "stdafx.h"
  2. include "Primitives.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

Toto::Toto() : i(0) {}

Toto::~Toto(){}

Primitives::Primitives()
{

}

Toto* appel()
{
return( P.Get() );
}

int Geti( Toto* objet )
{
return( objet->Get() );
}

------------------------
Le . h du prog appelant
------------------------

  1. define PRIMITIVES_H
  1. include <stdio.h>

__declspec(dllimport) class Toto*appel();
__declspec(dllimport) int Geti( Toto*objet );

  1. endif

-------------------------------
Enfin le . cpp du prog appelant
-------------------------------

  1. include "stdafx.h"
  2. include "Primitives.h"
  1. pragma comment(lib,"Primitives.lib")

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

FILE* f = fopen("debug.txt","w");

Toto* T = NULL;
fprintf(f, "Adresse de T = %p\n", T);

T = appel();

fprintf(f, "Adresse de T = %p\n", T);
fprintf(f, "i = %i\n", Geti(T) );

fclose(f);
return 0;
}

Kelios
Kelios
Niveau 8
08 novembre 2002 à 16:07:01

Effectivement... je n´avais pas pensé à faire des méthodes pour mes fonctions! arf, moi qui m´était emmerdé pour rien!

Merci, je n´y pensais pas!

Kelios
------

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware