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 :

Déclaration et compilation DLL


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Déclaration et compilation DLL
    que pensez vous de ma DLL?

    fichier .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #define int_dll  __declspec(dllexport) int __stdcall
    #define void_dll  __declspec(dllexport) void  __stdcall
    #define double_dll __declspec(dllexport) double __stdcall
    #define long_dll __declspec(dllexport) long __stdcall 
    namespace finum{
        double N(int x);
    	 double DoubleElements(int* x,long lngNbItems);
    }
    extern "C" {
    double finum:: N(int x){
    	return x;
    }
    fichier .c:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdlib.h>
    #include <stdio.h>
    #include "finum.h"
     
    double finum:: N(int x){
    	return x;
    }
    peut on faire plus court?
    notamment supprimer le namespace?

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Ca compile ça: ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    extern "C" {
    double finum:: N(int x){
    	return x;
    }
    D'autre part... qui dit DLL dit aussi client de l'autre coté. Comment le client incluera-t-il ton header ?

    En général on fait un truc genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifdef MA_DLL_EXPORTS
    #define MA_DLL_API    __declspec(dllexport)
    #else
    #define MA_DLL_API    __declspec(dllimport)
    #endif
     
    namespace ma_dll
    {
         void MA_DLL_API mafonction();
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, je n'ai jamais vu des fonctions extern "C" avec namespace. Si ça compile, je ne sais pas ce que ça donne.
    Mais avec un peu de chance, c'est spécifié et ça donne un nom fixe (par exemple, le nom de fonction sans le namespace), et la fonction sera donc bien utilisable en DLL.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ca compile ça: ?
    oui ca compile. J'ai jamais eu de pb
    Mais c'est pas moi qui ai fait ce programme.
    Quel est le probleme selon toi?

    Quand ca compile, et que j'ouvre la DLL avec un programme special (Depends.exe)
    les fonctions ont des noms du type:

    _N@8, _N@16, _N@4.....

    Si j'utilise pas de namespace, il me semble que les fonctions existent dans la DLL, mais elles ont des noms bizarre
    du style N@ARERE@ enfin qqch dans ce style.



    ca correspond a quoi ca?
    ou l'as tu defini?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Quand ca compile, et que j'ouvre la DLL avec un programme special (Depends.exe)
    les fonctions ont des noms du type:
    _N@8, _N@16, _N@4.....
    OK, les noms sont donc bien exportés sans le namespace.

    Si j'utilise pas de namespace, il me semble que les fonctions existent dans la DLL, mais elles ont des noms bizarre
    du style N@ARERE@ enfin qqch dans ce style.
    Ça, c'est quand tu ne mets pas le extern "C"

    ca correspond a quoi ca?
    ou l'as tu defini?
    Ça se définit dans les options du projet de la DLL, et pour la DLL uniquement.
    Ainsi, quand tu compiles la DLL, MA_DLL_API équivaut à dllexport, et quand tu compiles un programme qui utilise la DLL, MA_DLL_API équivaut à dllimport.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ça, c'est quand tu ne mets pas le extern "C"
    Est-ce que tu penses que VBA va pouvoir reconnaitre les fonctions qui sont definies de cette facon

    Parce que dans VBA, je declare les fonctions (a peu pres) comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Nameof_function "C:\......" alias "_N@4" (Byval ......) as Double
    Puis-je faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Nameof_function "C:\......" alias "_N@ARERE@" (Byval ......) as Double

    De plus que signifie le terme @ et le chiffre apres le @?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je te le déconseille vivement.
    Une fonction de DLL doit être extern "C" et __stdcall pour être utilisable librement depuis pratiquement n'importe quel langage. N'oublie pas que le nom manglé C++ est dépendant du compilateur, contrairement au nom "C".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [WebForms][Compilation][DLL] Accès refusé
    Par ramalho dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 30/01/2008, 10h44
  2. Compilation Dll avec VS Express 2005
    Par Bartuk dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 31/07/2006, 17h52
  3. Compiler dll avec Dev-Cpp
    Par madislak dans le forum Dev-C++
    Réponses: 2
    Dernier message: 15/02/2006, 18h06
  4. Erreur compilation DLL dans Eelphi 6
    Par jakouz dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2005, 16h38
  5. déclaration d'une dll
    Par lixahk5 dans le forum MFC
    Réponses: 8
    Dernier message: 17/02/2004, 12h28

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