IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

C++ objet vers C


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut C++ objet vers C
    Bonjour tout le monde,

    petite question, j'ai un constructeur en C++ de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // test.h
    CReseau(IN CComBase *po_com, 
    			IN PFCT_MESS_MANAGER pfct_message_manager, 
    			IN void *pv_owner, 
    			IN const BYTE *pby_address_sop_locale = NULL, 
    			IN DWORD dw_flags = DEFAULT_FLAGS);
    que j'aimerai exporter dans ma dll grâce à ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "test.h"
    extern "C" {
    	CReseauHandle LIBCOMHSL_API NewCReseau(CComBase *po_com, 
    			PFCT_MESS_MANAGER pfct_message_manager, 
    			void *pv_owner, 
    			const BYTE *pby_address_sop_locale = NULL, 
    			DWORD dw_flags = DEFAULT_FLAGS)
    	{
    		CCombase pcombase;
    		return new CReseau(po_com,pfct_message_manager,pv_owner, 
    			 pby_address_sop_locale,dw_flags);		
    	}
    est-ce que je peux faire en sorte de créer ces différents objets et méthodes "à la volée" pour éviter de passer ces paramètres dans le programme qui appellera la dll ?

    Je ne vois pas comment créer l'objet et les méthodes pour les passer directement en paramètre en gros ...

    du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    extern "C" {
    	CReseauHandle LIBCOMHSL_API NewCReseau(void)
    	{
    		CCombase pcombase;
    		return new CReseau("objet",NULL,pv_owner, 
    			 pby_address_sop_locale,dw_flags);		
    	}
    Voilà si quelqu'un à un début d'idée je suis preneur !

    Merci !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    une solution classique:
    des fonctions prenant un pointeur vers une structure (non définie dans l'entete)

    ces fonctions appellent juste la méthode sur le pointé.

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //.h
    struct Lib_objet;
     
    Lib_objet* Lib_objet_creer(arg1_type, arg2_type);
    void Lib_objet_fonction1(Lib_objet* o, arg_type);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //.cpp
    struct Lib_objet {
        Lib_objet_creer(arg1_type, arg2_type);
        void fonction1(arg_type a);
    };
     
    Lib_objet* Lib_objet_creer(arg1_type a1, arg2_type a2) {return new Lib_objet(a1, a2);}
     
    void Lib_objet_fonction1(Lib_objet* o, arg_type a) {if(o) o->fonction1(a);}
    Bien sûr, cela veut aussi dire qu'il faut une fonction de libération, et expliquer copieusement à l'utilisateur qu'il est prié de les utiliser par paire (comme malloc/free)


    Ou alors, je n'ai rien compris à ta question
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Alors je ne sais pas si c'est bien cela, je vais m'exprimer plus concrètement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	extern "C" {
    	CReseauHandle  __declspec(dllexport) __cdecl NewCReseau(CComBase *po_com, 
    			PFCT_MESS_MANAGER pfct_message_manager, 
    			void *pv_owner, 
    			const BYTE *pby_address_sop_locale = NULL, 
    			DWORD dw_flags = DEFAULT_FLAGS)
    	{
    		return new CReseau(po_com,pfct_message_manager,pv_owner, 
    			 pby_address_sop_locale,dw_flags);				
    	}
    }
    En fait j'ai un problème avec cette fonction (qui fait office d'instanciation de la classe CReseau) et plus particulièrement avec ce paramètre "CComBase *po_com" (pointeur de classe).
    J'appelle la DLL qui découle de ce code avec Delphi mais celui-ci ne gère pas les objets comme le C++, je voulais savoir si il y avait une méthode pour construire ce pointeur d'objet en langage C en gros ...

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    peut-être avec void* et des cast.

    Quel que soit ton choix, un pointeur ne sera utilisable que d'un seul coté de l'interface.

    Soit par l'utilisateur, qui crée et détruit l'objet à sa guise, auquel cas la bibliothèque ne peut se servir du pointeur que comme un identifiant.
    Soit par la bibliothèque, qui crée et détruit l'objet sur demande, mais dans ce cas, c'est l'utilisateur qui ne peut utiliser le pointeur que comme référence.

    Un bel exemple, c'est OpenGL, qui va carrément te donner un int, plutot qu'un pointeur, pour désigner ses textures.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Ok je vais voir cela de plus près, je mettrai le résultat de mes recherches dès que ça me semble correct, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. cast d'un objet vers des types dynamiques
    Par aymen007 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 25/06/2008, 09h31
  2. convertir un objet vers un tableau de byte
    Par zerocoolyoussef dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 19/02/2008, 23h11
  3. déplacer les objets vers un nouveau tablespace
    Par fouad77fr dans le forum Administration
    Réponses: 4
    Dernier message: 06/09/2007, 12h18
  4. Réponses: 2
    Dernier message: 23/02/2006, 15h51
  5. [Delphi 7] Transtypage d'un pointer objet vers un integer
    Par raoulmania dans le forum Langage
    Réponses: 2
    Dernier message: 09/12/2005, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo