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

C++ Discussion :

Classes différentes en DLL


Sujet :

C++

  1. #1
    Membre régulier Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Points : 78
    Points
    78
    Par défaut Classes différentes en DLL
    Bonjours

    Je me créer une petite DLL en CPP que j'utilise en C#
    J'ai créé une classe toute simple avec un constructeur reçevant une string. Tout compile bien. Sauf que quand j'importe ma DLL dans C#, je peux créer la classe sans mettre de string au constructeur. Ce n'est absolument pas logique. De plus, même quand je créer une instance, il n'y a aucune fonction qui s'affiche dans l'intellisense, comme s'il n'y avais aucune fonction dans le public:

    ChargementCPP.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // ChargementCPP.h
     
    #pragma once
     
    #include <string>
    using namespace std;
    using namespace System;
     
    namespace ChargementCPP {
     
    	public class ClSecuriteCPP
    	{
    	public :
    		ClSecuriteCPP(string);
    		string ObtenirVolume();
     
    	private :
    		string m_cheminFichier;
    	};
    }
    ChargementCPP.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // This is the main DLL file.
     
    #include "stdafx.h"
    #include "ChargementCPP.h"
    #include <string>
     
    using namespace ChargementCPP;
    using namespace std;
     
     
    ClSecuriteCPP::ClSecuriteCPP(string p_cheminFichier)
    {
    	this->m_cheminFichier = p_cheminFichier;
    }
     
    string ClSecuriteCPP::ObtenirVolume()
    {
    	/* instructions ici */
    	return "(kkchose)";
    }
    Je clarifie un peu les choses :
    en C# avec cette classe, je ne peux pas faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClSecuriteCPP sec = new ClSecuriteCPP(@"C:\fichier.txt");
    string volume = sec.ObtenirVolume();
    Je peux seulement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClSecuriteCPP sec = new ClSecuriteCPP();
    // sec.ObtenirVolume() n'existe pas dans cette instance
    Merci d'avance

  2. #2
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 177
    Points : 321
    Points
    321
    Par défaut
    A quoi sa peut te servir de créer une dll en c++ pour l'utiliser en c#? Fait le directement en C# c'est beaucoup plus simple.

  3. #3
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 177
    Points : 321
    Points
    321
    Par défaut
    Citation Envoyé par deejay2221 Voir le message
    Bonjours

    Je me créer une petite DLL en CPP que j'utilise en C#
    J'ai créé une classe toute simple avec un constructeur reçevant une string. Tout compile bien. Sauf que quand j'importe ma DLL dans C#, je peux créer la classe sans mettre de string au constructeur. Ce n'est absolument pas logique. De plus, même quand je créer une instance, il n'y a aucune fonction qui s'affiche dans l'intellisense, comme s'il n'y avais aucune fonction dans le public:

    ChargementCPP.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // ChargementCPP.h
     
    #pragma once
     
    #include <string>
    using namespace std;
    using namespace System;
     
    namespace ChargementCPP {
     
        public class ClSecuriteCPP
        {
        public :
            ClSecuriteCPP(string);
            string ObtenirVolume();
     
        private :
            string m_cheminFichier;
        };
    }
    ChargementCPP.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // This is the main DLL file.
     
    #include "stdafx.h"
    #include "ChargementCPP.h"
    #include <string>
     
    using namespace ChargementCPP;
    using namespace std;
     
     
    ClSecuriteCPP::ClSecuriteCPP(string p_cheminFichier)
    {
        this->m_cheminFichier = p_cheminFichier;
    }
     
    string ClSecuriteCPP::ObtenirVolume()
    {
        /* instructions ici */
        return "(kkchose)";
    }
    Je clarifie un peu les choses :
    en C# avec cette classe, je ne peux pas faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClSecuriteCPP sec = new ClSecuriteCPP(@"C:\fichier.txt");
    string volume = sec.ObtenirVolume();
    Je peux seulement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClSecuriteCPP sec = new ClSecuriteCPP();
    // sec.ObtenirVolume() n'existe pas dans cette instance
    Merci d'avance
    Et quelle est le message d'erreur de compilation as-tu?

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Est-ce que le problème ne viens pas tout simplement du fait que la classe n'est pas indiquée comme ayant ses symboles exposés par la dll?

    Essaie voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    // ChargementCPP.h
     
    #pragma once
     
    #define DllExport   __declspec( dllexport ) // une macro pour simplifier l'ecriture 
     
    #include <string>
    using namespace std;
    using namespace System;
     
    namespace ChargementCPP {
     
        public class DllExport ClSecuriteCPP // ici on indique que cette classe a ses symboles exposés pour utilisation d'un code client du dll
        {
        public :
            ClSecuriteCPP(string);
            string ObtenirVolume();
     
        private :
            string m_cheminFichier;
        };
    }

  5. #5
    Membre régulier Avatar de deejay2221
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 98
    Points : 78
    Points
    78
    Par défaut
    Merci Klaim
    Je vais essayer ça et je vous en reparle.

    Terminator :
    Je n'ai pas d'erreur de compil
    Je fais la classe en c++ parce que je ne sais pas comment faire une appèle système en C#... bon je sais que ce serait beaucoup plus simple...

    En fait, Je cherche une façon d'obtenir le numéro de volume du disque. En c++ la commande est toute simple :
    qui revient à tapper "vol" dans la console Windows.
    Et même là je ne sais pas comment récupéré le résultat envoyé par la console, exepté en créant un fichier d'output à partir de la console. Selon moi c'est du gossage.

  6. #6
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 177
    Points : 321
    Points
    321
    Par défaut
    Citation Envoyé par deejay2221 Voir le message
    Je n'ai pas d'erreur de compil
    Je fais la classe en c++ parce que je ne sais pas comment faire une appèle système en C#... bon je sais que ce serait beaucoup plus simple...
    Désolé, je pense sans trop réfléchir...

    En fait, Je cherche une façon d'obtenir le numéro de volume du disque..
    Quand tu parle de numéro de volume du disque, c'est le numéro de série.

    En c++ la commande est toute simple :
    qui revient à tapper "vol" dans la console Windows.
    Désolé! Mais je crains qu'il n'existe pas cette commande en c#!

    Mais il doit existé un autre moyen! Si tu connais un peu Delphi, il y a ça:

    http://delphi.developpez.com/faq/?pa...eroseriedisque

    Et la ça devrait t'intéressé c'est du C#, qui te permet d'avoir le numéro de série dans "Comment obtenir les informations d'un disque"

    http://faqcsharp.developpez.com/?page=syst#syst_info_hd

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    std::string n'est pas un type CLS-compliant.

    Tu devrais utiliser une System::String à la place, et marquer ta classe comme ref.
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    // ChargementCPP.h
     
    #pragma once
     
    #include <string>
     
    namespace ChargementCPP {
     
        public ref class ClSecuriteCPP
        {
        public :
            ClSecuriteCPP(System::String^ s);
            System::String^ ObtenirVolume();
     
        private :
            System::String^ m_cheminFichier;
        };
    }
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // This is the main DLL file.
     
    #include "stdafx.h"
    #include "ChargementCPP.h"
    #include <string>
     
    using namespace ChargementCPP;
    using namespace std;
     
     
    ClSecuriteCPP::ClSecuriteCPP(String^ p_cheminFichier)
    {
        this->m_cheminFichier = p_cheminFichier;
    }
     
    String^ ClSecuriteCPP::ObtenirVolume()
    {
        /* instructions ici */
        return L"(kkchose)";
    }
    Ainsi, ta classe devrait être utilisable depuis le C#

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Points : 89
    Points
    89
    Par défaut
    Juste une remarque en passant, rien à voir avec ton problème, mais on ne fait JAMAIS de using namespace dans un header.
    Ça peut créer des effets de bords difficiles à détecter lors de l'inclusion dudit header.

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

Discussions similaires

  1. Classes différentes en DLL
    Par deejay2221 dans le forum C#
    Réponses: 2
    Dernier message: 01/08/2008, 19h58
  2. utilisation de classe dans une DLL
    Par _stef_ffff_f34 dans le forum Windows
    Réponses: 1
    Dernier message: 10/02/2006, 16h03
  3. Réponses: 2
    Dernier message: 31/08/2005, 16h12
  4. Question sur exports et les classes (pour une dll)
    Par DjPoke dans le forum Langage
    Réponses: 7
    Dernier message: 08/08/2005, 19h25
  5. [Visual C++6] Accès à une classe d'une dll
    Par charliejo dans le forum MFC
    Réponses: 12
    Dernier message: 09/03/2005, 16h48

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