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

Qt Discussion :

Déclarer un objet avec QLibrary


Sujet :

Qt

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Déclarer un objet avec QLibrary
    Bonjour à tous !

    Je viens de m'inscrire et je vous remercie d'avance pour votre aide (parce que je sais que vous êtes tous gentil et que vous allez m'aider, vous êtes trop forts )

    Voici mon problème: dans le cadre d'un projet, je dois utiliser une dll qui contient plusieurs objets et dont ces objets ont des fonctions qui leur sont propre (des classes quoi). Seulement, je n'ai que cette dll, pas de lib, pas d'include .... rien. Du coup, en cherchant sur les forums, j'ai trouvé QLibrary.

    J'arrive à télécharger la librairie (enfin à l'importer) mais je ne sais pas comment créer un objet pour appeler ses fonction. Voici ce que j'ai fait :

    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
     
    QLibrary *lib;
    lib=new QLibrary("IntegMotorInterface");
    lib->load();
    if(lib->isLoaded()){
        QmessageBox *mess;
        mess=new QmessageBox();
        mess->setText("fonctionne");
        mess->show();
    }
    else{
        QmessageBox *mess;
        mess=new QmessageBox();
        mess->setText("fonctionne pas");
        mess->show();
    }
    Ca, ça fonctionne, j'ai bien mon message "fonctionne".

    J'ai aussi trouvé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef void (*MyPrototype)();
    MyPrototype myFunction =(MyPrototype) QLibrary::resolve("mylib", mysymbol");
    if (myFunction){
         myFunction();
    }
    mais je ne sais pas comment l'adapter pour créer une instance d'un objet (par exemple SMIHost).


    Le fichier IntegMotorInterface.dll a été écrit avec MSVC C++ 2005. J'utilise Qt creator avec le comilateur MSVC 2010.

    Des idées ?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Sans les .h pour retrouver les définitions des classes/structures, cela peut être légèrement compliqué. Toutefois, avec le resolve, vous devriez être capable de récupérer toutes les fonctions disponible dans votre bibliothèque.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse. Je n'ai pas les .h mais j'ai une documentation assez bien faite avec le détail des fonctions et des objets.

    J'ai vu que l'on pouvez utiliser la fonction "resolve" mais qu'elle ne marchait pas si la dll a été écrite en c++, ce qui est mon cas.

    En fait, dans cette dll il est sensé y avoir 3 objets, donc 3 classes, avec pour chaque objet des fonctions qui lui sont propre. QLibrary permet de résolver une fonction mais pour un objet ? Comment ça se passe ? C'est là que je bloque.

    Merci pour vos réponses.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Si vous avez une documentation, celle-ci devrait vous expliquer comment utiliser la DLL, non ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai du nouveau concernant les sources. Maintenant je dispose de ça :
    - IntegMotorInterface.dll
    - IntegMotorInterface.h
    - IntegMotorInterface.tlb

    Comme vous pouvez le deviner, c'est pour utiliser un port com qui gèrera un moteur. C'est la première foie que je voie un fichier .tlb.

    Voila ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "IntegMotorInterface.h"
    #import "IntegMotorInterface.tlb"
     
    int main(int argc, char** argv){
     
        SMIMotor moteur;
        SMIHost host;
     
    }
    SMIMotor et SMIHost sont 2 objets normalement présent dans la dll (ou tlb).

    J'essaie de faire des recherches pour voir comment fonctionne les .tlb mais je ne trouve pas grand chose. Donc si vous trouvez en plus un tuto pour débutant pour les .tlb (première fois que je voie les .tlb et que j'utilise un port com !) ce serait cool.

    En revanche, il me met une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'moteur' utilise une classe 'SMIMoteur' non définie.
    'host' utilise une classe 'SMIHost' non définie.
    Est ce que il me manque un .h ou .dll ?

    Merci

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Je ne sais pas ce que sont les fichiers TLB. Que contient t-il ? (toujours pas de documentation ?)

    Par contre, il vous manque un fichier .lib (ou .a) qu'il faut lier (option de l'éditeur de lien) à votre programme afin que le compilateur trouve le code à exécuter lorsque vous appelez telle ou telle fonction.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Les fichiers .tlb sont une sorte de lib. Apparament c'est spécial visual studio. Est ce que je dois changer de forum pour avoir une réponse ?

    J'ai télécharger visual studio professional ainsi que le plugin pour Qt. Seulement, j'ai un .pro et visual ne le trouve pas. Est ce qu'il y a un moyen d'ouvrir mon projet avec visual studio sans créer un nouveau projet et faire un copier coller de toutes mes classes ?

    PS: j'ai appris que mon .tlb utilise les MFC ...

  8. #8
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 606
    Points
    188 606
    Par défaut
    Citation Envoyé par Miss Kate Voir le message
    Est ce qu'il y a un moyen d'ouvrir mon projet avec visual studio sans créer un nouveau projet et faire un copier coller de toutes mes classes ?
    Pour moi (VS10, plug-in Qt 5), menu Qt 5 (après View), Import Qt Project File.

    Maintenant, pour ta communication par port COM, s'il est envisageable de réimplémenter le protocole de communication avec le moteur, tente ta chance avec un add-on de Qt 4/5 : http://qt-project.org/wiki/QtSerialPort.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Solution parallèle
    Bon, finalement j'ai abandonné le fait de me servir de la librairie. En fait le moteur dont je me sert utilise une carte : je peux directement lui envoyer du code ASCII sur le port COM. Il le compile et exécute la commande. Du coup, j'utilise la librairie QextSerialPort pour communiquer avec le port.

    Voici un bout de code pour les curieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        QextSerialPort *port;
        port = new QextSerialPort("COM4");
        port->setBaudRate(BAUD9600); // vitesse d'envoie des données
        port->setFlowControl(FLOW_OFF); //
        port->setParity(PAR_NONE); //pas de bit de parité
        port->setDataBits(DATA_8); // envoie d'un octet
        port->setStopBits(STOP_1); // bit  de stop
        port->open(QIODevice::ReadWrite);
     
        port->write("ADT=1200 X ZS "); // envoie de la commande au moteur
     
        port->close(); // fermeture du port
    PS: je n'ai pas réussi à compiler la version 1.2-alpha de la librairie, ni avec MSVC 2010 ni avec minGW. La compilation avec MSVC 2010 de la version 1.1 n'a pas fonctionnée non plus. Je suis donc avec Qt Creator, Qt 4.8 et minGW (compilation ok ).

    Téléchargement officiel : sourceforge --> prendre la version .tar.gz et décompresser avec WinRar (gratuit : il demande toujours de télécharger la vraie version, on ferme et il est contant !) car 7zip ne le prend pas en charge.

    Merci pour tout même si je n'ai pas LA réponse !
    A bientôt pour de nouveaux bugs (vous ou moi)

  10. #10
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    7zip prend (heureusement) bien en charge le .tar.gz.

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

Discussions similaires

  1. Déclarer un objet avec Visual Studio 2010
    Par JeanNoel53 dans le forum C++/CLI
    Réponses: 17
    Dernier message: 03/05/2012, 12h27
  2. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  3. Réponses: 3
    Dernier message: 22/12/2005, 00h40
  4. nommer un objet avec une variable
    Par fatcat dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2005, 16h16
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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