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 :

Fonction d'une DLL qui retourne plusieur valeur


Sujet :

C++

  1. #1
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut Fonction d'une DLL qui retourne plusieur valeur
    Bonjour,

    dans mon programme, je veux appeler un fonction qui se trouve dans une DLL, et je voudrai quel me retourne plusieurs valeur. J'ai essayé avec un vecteur mais sa ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C++" __declspec(dllimport)std::vector<float> __stdcall Com_Serie_Read ();
    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
     {
    				int Carte(2),Alarme(0),ret(0);
    				float Tair(0),Tcut(0),Consigne(0),HR(0);
    				std::vector<float> Tab;
     
    				Tab=Com_Serie_Read ();
    				alarme->Text="Etape 1";
     
    				Carte=Tab[0];
    				Alarme=Tab[1];
    				Tair=Tab[2];
    				Tcut=Tab[3];
    				Consigne=Tab[4];
    				HR=Tab[5];
     
    					if (Carte==0)
    					{
    						pCarte->ForeColor=System::Drawing::Color::Red;
    						pCarte->Text="Carte Deconnectée";
     
    					}
    					if (Carte==1)
    					{
     
    						pCarte->ForeColor=System::Drawing::Color::Lime;
    						pCarte->Text="Carte Connectée";
     
    						if(Alarme==0)
    							alarme->Text="Alarme Eteinte";
    						else if (Alarme==1)
    						{	
    							alarme->ForeColor=System::Drawing::Color::Red;
    							alarme->Text="Alarme Allumée";
    						}
    						tair->Text=Convert::ToString(Tair);
    						tcut->Text=Convert::ToString(Tcut);
    						cons->Text=Convert::ToString(Consigne);
    						hum->Text=Convert::ToString(HR);
    					}
    					if (Carte==2)
    						alarme->Text="Probléme";
    			 }
    avec sa sa plante


    j'ai aussi essayé comme sa:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern "C++" __declspec(dllimport)int __stdcall Com_Serie_Read (int Alarme,float Tair,float Tcut,float Consigne,float HR);
    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
     {
    				int Carte(0),Alarme(0),ret(0);
    				float Tair(0),Tcut(0),Consigne(0),HR(0);
     
                  	                carte= Com_Serie_Read (Alarme,Tair,Tcut,Consigne,HR);
    				alarme->Text="Etape 1";
     
     
    					if (Carte==0)
    					{
    						pCarte->ForeColor=System::Drawing::Color::Red;
    						pCarte->Text="Carte Deconnectée";
     
    					}
    					if (Carte==1)
    					{
     
    						pCarte->ForeColor=System::Drawing::Color::Lime;
    						pCarte->Text="Carte Connectée";
     
    						if(Alarme==0)
    							alarme->Text="Alarme Eteinte";
    						else if (Alarme==1)
    						{	
    							alarme->ForeColor=System::Drawing::Color::Red;
    							alarme->Text="Alarme Allumée";
    						}
    						tair->Text=Convert::ToString(Tair);
    						tcut->Text=Convert::ToString(Tcut);
    						cons->Text=Convert::ToString(Consigne);
    						hum->Text=Convert::ToString(HR);
    					}
     
    			 }
    donc la je me retrouve tout le temps avec les variable à zéro, il ne prend pas en compte les modification effectué sur les variables par la DLL

  2. #2
    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 578
    Points
    41 578
    Par défaut
    Attends, puisque tu programmes en .Net, pourquoi ne pas prendre simplement les paramètres par tracking reference (float%) ?
    Ou bien, retourner une System::Collections::Generic::List<float>, ou une structure, ou un objet alloué sur le tas managé...

  3. #3
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    euh parce que je ne connais pas j'apprend au fur et à mesure en fonction de ce que j'ai besoin
    je vais voir ce que je trouve dans les cours...

  4. #4
    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 578
    Points
    41 578
    Par défaut
    D'un autre côté, si tu es en .Net, ne fais même pas une fonction libre: Plutôt que mettre des extern "C++", dllexport et cie, il est plus simple d'exposer des méthodes statiques d'une méthode statique:

    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //ComSerie.h
     
    //Déclaration d'une classe statique:
    //En C++/CLI, on met "abstract" et "sealed" ensemble pour ça.
    public ref class ComSerie abstract sealed
    {
    public:
    	//Déclaration d'une méthode statique
    	static System::Collections::Generic::List<float>^ Read();
    };
    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //ComSerie.cpp
    #include "ComSerie.h"
    using namespace System;
    using namespace System::Collections::Generic;
     
    List<float>^ ComSerie::Read()
    {
    	//Ton code
    }

  5. #5
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    donc si j'ai bien compris il faut que je créé un .h et que je l'associe au .cpp qui correspond à ma DLL.
    Mais dans mon form1.h je l'appel comment la fonction aprés?

    De plus, dans cette DLL j'exporte une autre fonction donc dans mon .h si j'ai bien compris je met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //ComSerie.h
     
    //Déclaration d'une classe statique:
    //En C++/CLI, on met "abstract" et "sealed" ensemble pour ça.
    public ref class ComSerie abstract sealed
    {
    public:
    	//Déclaration d'une méthode statique
    	static System::Collections::Generic::List<float>^ Read();
     
    public:
    	static int Write(float);
    };
    et dans le .cpp

    je l'appel comme sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int ComSerie::Write(float)
    {
    	//Mon code
    }

    EDIT: je ne trouve rien à propos de System::Collections::Generic::List<float> comment est que je déclare un truc comme sa et ensuite pour ajouter des valeurs dans cette liste sa marche comment? comme u vecteur?

  6. #6
    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 578
    Points
    41 578
    Par défaut
    Écoute, tu dois faire un choix: Faire du C++ pur ou faire du .Net (C++/CLI).

    Mais si tu ne fais pas ta DLL en .Net, tu auras des problèmes pour les vector et autres classes de la STL (par contre, tu peux toujours prendre tes paramètres par référence).

  7. #7
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    j'utilise des vector dans ma DLL, donc je resterai en C++ et comme je connai pas le .net je pense que sa vaut mieux...

    Mais donc une fonction ne peut pas retourner un vecteur? Et si je prend les paramètres par tracking reference c'est du .NET je suppose il y a une autre solution sinon?

  8. #8
    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 578
    Points
    41 578
    Par défaut
    Tu peux prendre les paramètres par référence normale (float &) plutôt que par tracking reference (float %).

    Et d'une manière générale, tu ne peux pas utiliser simplement des classes de la STL dans l'interface d'une DLL: Il y a des complications, c'est une des raisons pour lesquelles on conseille que toutes les fonctions d'une DLL aient une interface C.

  9. #9
    Membre régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    Par défaut
    c'est bon sa marche en passant par référence normal

    ok, c'est peut être pour sa que stringstream marche pas... du coup j'arrive pas à récupérer le contenu d'une textbox dans un float, alors si quelqu'un à une idée pendant que j'y suis

  10. #10
    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 578
    Points
    41 578
    Par défaut
    Si tu utilises une TextBox managée, alors du programmes en .Net...

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

Discussions similaires

  1. Fonction qui retourne plusieurs valeurs !
    Par casafa dans le forum C++
    Réponses: 20
    Dernier message: 23/04/2014, 16h56
  2. [WD17] Créer une procédure qui renvoie plusieurs valeurs
    Par meganulos dans le forum WinDev
    Réponses: 9
    Dernier message: 27/02/2013, 20h21
  3. Fonction qui retourne plusieurs valeurs
    Par maestro982 dans le forum Langage
    Réponses: 3
    Dernier message: 29/09/2011, 14h46
  4. Réponses: 11
    Dernier message: 21/03/2008, 12h24
  5. [PL/SQL] Fonction qui retourne plusieurs valeurs
    Par Loko dans le forum Oracle
    Réponses: 2
    Dernier message: 07/12/2004, 09h43

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