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 :

Générer une DLL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut Générer une DLL
    Bonjour,

    Pouvez-vous me dire comment puis-je transformer ce script afin d'en générer un fichier *.DLL ?

    Il s'agit d'une DLL avec pour données d'entrée : moyenne et sigma et en données de sortie : x1 et x2.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    // vargauss.cpp*: définit les fonctions exportées pour l'application DLL.
    //
     
    #include "stdafx.h"
    #include <windows.h>
    #include <cstdlib>
    #include <iomanip> 
    #include <stdlib.h>
    #include <ctime>
     
    #include <cmath>
    #include <stdio.h>
     
     
    //#include <vector>
     
     
    // *************************************
    double randomUniform (double _iMin,double _iMax)
    {
    // return (_iMin + (rand () % (_iMax-_iMin+1)));
    return ((_iMax-_iMin)*(rand()/(double)RAND_MAX)+_iMin);
    }
    // *************************************
    void boxMuller(double &px1,double &px2, double _moyenne, double _sigma)
    {
     
    double U1=randomUniform(0,1);
    double U2=randomUniform(0,1);
    const double g_Pi = 3.14159265358979323846;
     
    px1 = sqrt(-2 * log(U2)) * cos(2 * g_Pi * U1) * _sigma + _moyenne;
    px2 = sqrt(-2 * log(U2)) * sin(2 * g_Pi * U1) * _sigma + _moyenne;
     
    }
     
    // ++++++++++++++++++++++++++++++++++++++++
    int main(int argc)
    {
    	srand(time(NULL));
    	double moyenne = 0;
    	double sigma = 10/3;
    	double x1, x2;
    	boxMuller(x1,x2,moyenne,sigma) ;
     
    	return 0; 
    }
    Avec Visual Express 2010, j'ai copier / coller la syntaxe d'une ébauche qui tourne en tant que programme sous c++.

    Nom : dll.PNG
Affichages : 789
Taille : 58,2 Ko


    Merci

  2. #2
    Membre Expert
    Avatar de cpcdos
    Homme Profil pro
    Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Inscrit en
    Mai 2010
    Messages
    589
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingé/concepteur chez Capgemini. Alstom APTIS. Concepteur de Felly autonomous vehicle software.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 589
    Billets dans le blog
    1
    Par défaut
    Salut,

    Dans les propriétés du projet Visual studio, tu peux choisir le Type de sortie, je pense que tu es en console ? Choisis "Bibliothèque de classes"
    Nom : snip_20161103093138.png
Affichages : 569
Taille : 10,3 Ko
    J'ai Visual Studio 2015 pro, je sais plus si 2010 a la même tête

    Et une biblo n'a pas de point d'entré, en gros ton int main(int argc) ne doit pas exister. Renomme le en int __main() par exemple

    Ceci peut t'aider d'avantage https://msdn.microsoft.com/fr-fr/library/ms235636.aspx
    Sébastien FAVIER
    Felly-software Autonomous vehicle software for everyone.
    co-kernel Cpcdos OSx un noyau 32bits simplifié et complet.. ou presque - Le fofo officiel c'est par ici.
    Les cours sur les systèmes c'est par là

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Attention, la dropdown sur ta capture d'écran, c'est pour .Net.
    Par contre, le lien est bon.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Citation Envoyé par cpcdos Voir le message
    Merci pour ce lien.

    L'exemple de ce lien fait appel à une seule variable à retourner par le biais de return . Comment faire lorsque la dll doit renvoyer 2 variables ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par macErmite Voir le message
    Comment faire lorsque la dll doit renvoyer 2 variables ?
    Si tu es en C++, que tu développes une DLL ou un programme, ou n'importe quoi, tu ne peux retourner qu'une seule valeur.
    Que certains langages utilisent des structures pour masquer ce fait et donner l'illusion de retourner 2 valeurs n'y change rien.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par macErmite Voir le message
    Merci pour ce lien.

    L'exemple de ce lien fait appel à une seule variable à retourner par le biais de return . Comment faire lorsque la dll doit renvoyer 2 variables ?
    Elle prend au moins l'une des deux variables par référence ou par pointeur.
    Si tu veux maintenir une interface "C" (pour être compatible avec d'autres langages que le C++, ou même compatible avec le C++ compilé par d'autres compilateurs) alors ce sera par pointeur.
    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Code pour la dll :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    // VarAleaGauss.cpp*: définit les fonctions exportées pour l'application DLL.
    //
     
    #include "stdafx.h"
     
    #include <windows.h>
    #include <tchar.h>
    #include <iostream>       // std::cout
    #include <string>         // std::string
    #include <fstream>
    #include <sstream>
    #include <cstdlib>
    #include <iomanip> 
    #include <stdlib.h>
    #include <ctime>
     
    #include <cmath>
    #include <limits>
     
    #include <stdio.h>
    #include <conio.h>
    #include <vector>
     
    using namespace std;
    double randomUniform (double _iMin,double _iMax)
    {
    // return (_iMin + (rand () % (_iMax-_iMin+1)));
    return ((_iMax-_iMin)*(rand()/(double)RAND_MAX)+_iMin);
    }
    // *************************************
    void boxMuller(double &px1,double &px2, double _moyenne, double _sigma)
    {
     
    double U1=randomUniform(0,1);
    double U2=randomUniform(0,1);
    const double g_Pi = 3.14159265358979323846;
     
    px1 = sqrt(-2 * log(U2)) * cos(2 * g_Pi * U1) * _sigma + _moyenne;
    px2 = sqrt(-2 * log(U2)) * sin(2 * g_Pi * U1) * _sigma + _moyenne;
     
    // cout << "--->  x1 :" << *px1  << " x2 :" << *px2 << endl ;
     
    }
     
    extern "C" __declspec(dllexport) double *VarAleaGaussTirage(double moyenne, double sigma)
    {
    	int const taille = 2 ;
    	double data[taille];
     
    	double px1, px2;
    	srand(time(NULL));
     
    	boxMuller(px1,px2,moyenne,sigma) ;
    	data[1] = px1;
    	data[2] = px2;
     
    	return data;
    }
    VC++ ne trouve pas d'erreur lors de la compilation et la génération des fichiers lib et dll.

    Puis j'essaie de tester cette dll dans un programme :

    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
    // stdafx.h*: fichier Include pour les fichiers Include système standard,
    // ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment,
    // et sont rarement modifiés
    //
     
    #pragma once
     
    #include "targetver.h"
     
    #include <stdio.h>
    #include <tchar.h>
     
    #pragma comment (lib, "VarAleaGauss.lib")
    extern "C" __declspec(dllimport) double *VarAleaGaussTirage(double moyenne, double sigma);
     
     
    // TODO: faites référence ici aux en-têtes supplémentaires nécessaires au programme

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    // DLL_test.cpp*: définit le point d'entrée pour l'application console.
    //
     
     
    #include "stdafx.h"
     
    #include <windows.h>
    #include <tchar.h>
    #include <iostream>       // std::cout
    #include <string>         // std::string
    #include <fstream>
    #include <sstream>
    #include <cstdlib>
    #include <iomanip> 
    #include <stdlib.h>
    #include <ctime>
     
    #include <cmath>
    #include <limits>
     
    #include <stdio.h>
    #include <conio.h>
    #include <vector>
     
    using namespace std;
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    		int const cycle = 10000;
    	double moyenne = 0;
    	double sigma = 10/3;
     
    	int const taille = 2 ;
    	vector<double> resultat(taille);
     
    	srand(time(NULL));
     
    /*TIRAGE DE VALEUR ALEATOIRE*/
     
    	resultat = VarAleaGaussTirage(moyenne, sigma);
     
    	cout << "x1 : " << resultat[1] << "   x2 : " << resultat[2] << endl ;
     
    	system("PAUSE");
     
    	return 0;
    }
    Et bien-sûr cela ne fonctionne pas ... Je ne trouve pas de tuto complet pour generer/exploiter des dll ...

    Pouvez-vous m'apporter vos remarques pour débloquer cette situation.

    Merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 147
    Par défaut
    Modification du fichier dll :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    // VarAleaGauss.cpp*: définit les fonctions exportées pour l'application DLL.
    //
     
    #include "stdafx.h"
     
    #include <windows.h>
    #include <tchar.h>
    #include <iostream>       // std::cout
    #include <string>         // std::string
    #include <fstream>
    #include <sstream>
    #include <cstdlib>
    #include <iomanip> 
    #include <stdlib.h>
    #include <ctime>
     
    #include <cmath>
    #include <limits>
     
    #include <stdio.h>
    #include <conio.h>
    #include <vector>
     
    using namespace std;
    double randomUniform (double _iMin,double _iMax)
    {
    // return (_iMin + (rand () % (_iMax-_iMin+1)));
    srand(time(NULL));
    return ((_iMax-_iMin)*(rand()/(double)RAND_MAX)+_iMin);
    }
    // *************************************
    void boxMuller(double &px1,double &px2, double _moyenne, double _sigma)
    {
     
    double U1=randomUniform(0,1);
    double U2=randomUniform(0,1);
    const double g_Pi = 3.14159265358979323846;
     
    px1 = sqrt(-2 * log(U2)) * cos(2 * g_Pi * U1) * _sigma + _moyenne;
    px2 = sqrt(-2 * log(U2)) * sin(2 * g_Pi * U1) * _sigma + _moyenne;
     
    // cout << "--->  x1 :" << *px1  << " x2 :" << *px2 << endl ;
     
    }
     
    extern "C" __declspec(dllexport) double *VarAleaGaussTirage(double moyenne, double sigma)
    {
    	int const taille = 2 ;
    	double *data = new double[taille];
     
    	double px1, px2;
     
    	boxMuller(px1,px2,moyenne,sigma) ;
    	data[1] = px1;
    	data[2] = px2;
     
    	return data;
    }
    Modification du fichier "client" :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    // DLL_test.cpp*: définit le point d'entrée pour l'application console.
    //
     
     
    #include "stdafx.h"
     
    #include <windows.h>
    #include <tchar.h>
    #include <iostream>       // std::cout
    #include <string>         // std::string
    #include <fstream>
    #include <sstream>
    #include <cstdlib>
    #include <iomanip> 
    #include <stdlib.h>
    #include <ctime>
     
    #include <cmath>
    #include <limits>
     
    #include <stdio.h>
    #include <conio.h>
    #include <vector>
     
    using namespace std;
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	int cycle = 10;
    	double moyenne = 0;
    	double sigma = 10/3;
     
    	int const taille = 2 ;
    	double *resultat = new double[taille] ;
     
    /*TIRAGE DE VALEUR ALEATOIRE*/
     
    	for(int i=0;i<cycle;i++)
    	{
    	resultat = VarAleaGaussTirage(moyenne, sigma);
    	cout << "x1 : " << resultat[1] << "   x2 : " << resultat[2] << endl ;
    	}
     
    	system("PAUSE");
     
    	return 0;
    }
    Il n'y a plus d'erreurs, cependant la boucle affiche 10x les mêmes valeurs ...

Discussions similaires

  1. Générer une dll pour une application en dotNET
    Par punto dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/04/2008, 16h14
  2. Générer une dll à la volée
    Par LEK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 01/02/2008, 14h35
  3. Comment générer une DLL a partir de sources C++
    Par cyril_813 dans le forum C++
    Réponses: 55
    Dernier message: 08/10/2007, 14h49
  4. [VS.NET]Comment générer une dll de page ?
    Par fnganiet dans le forum Visual Studio
    Réponses: 4
    Dernier message: 19/05/2006, 14h28
  5. Générer une dll 16 bits avec delphi 7
    Par chtiot dans le forum EDI
    Réponses: 4
    Dernier message: 21/02/2006, 18h50

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