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

Discussion :

Communication avec une DLL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Communication avec une DLL
    Bonjour à tous,

    Je vous expose mon problème. On me fournit une DLL (compilée avec MS Visual Studio 6) et je suis censé réaliser une appli Qt qui utilise des fonctions de cette DLL (lecture/écriture de fichiers propriétaires entre autres choses). Je ne peux pas partager l'intégralité du code avec vous, mais en voici un template.

    Dll_Importee.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
     
    #ifndef _DLL_IMPORTEE_H
    #define _DLL_IMPORTEE_H
     
    #include    <windows.h>
    #include    <QtCore/qglobal.h>
    #include	<stdio.h>
     
    #define DLLIMPORT  _declspec(dllimport)
     
    extern "C"
    {
        ...
        DLLIMPORT void	Fonction1(	char* pChaine	);
        ...
    }
    #endif
    voici le main de mon appli Qt :
    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
     
    #include "Mywindow.h"
    #include <QApplication>
    #include "Dll_Importee.h"
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MyWindow w;
     
        w.show();
        Fonction1("test1");
     
        return a.exec();
    }
    et voici mon .pro
    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
     
    QT       += core gui
     
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
     
    TARGET = MyApp
    TEMPLATE = app
     
    SOURCES += main.cpp\
            Mywindow.cpp \
    
    HEADERS  += Mywindow.h \
        Inc/Dll_Importee.h \
    
    INCLUDEPATH+= Inc/
    DEPENDPATH+= Inc/
     
    FORMS    += Mywindow.ui
     
    win32: LIBS += -L$$PWD/Library/ -lDll_Importee
     
    INCLUDEPATH += $$PWD/Library
    DEPENDPATH += $$PWD/Library
     
    win32:!win32-g++ PRE_TARGETDEPS += $$PWD/Library/Dll_Importee.lib
    else:win32-g++: PRE_TARGETDEPS += $$PWD/Library/libDll_Importee.a
    J'ai tenté de faire importer la librairie automatiquement pas QtCreator (Statique et dynamique, j'ai tenté les deux, là, vous avez la version statique), j'ai essayé de le faire à la main en partant d'un autre projet qui fonctionne... Rien à faire...

    Ce code compile (avec un warning rapport à la différence String/Char*) et s'exécute si la ligne du main " Fonction1("test1");" est commentée (l'appel à une fonction de la DLL/LIB). à Partir du moment ou je décommente cette ligne, j'obtiens un message d'erreur au lancement "During startup, prgram exited with code 0xc0000135".

    L'architecture du projet est la suivante : de base, Architecture pour un nouveau projet Qt, les fichiers .h importés sont dans un dossier Inc sous la racine du projet Qt, la LIB importée est dans un dossier Librairy sous la racine du projet Qt, la DLL est sous la racine du projet et dans le dossier Library (à deux endroits pour tenter de faire fonctionner le schmilblick dans un premier temps)

    Je suppose qu'il doit y avoir un tout petit détail qui m'échappe, mais je ne m'en sors pas, je n'arrive pas à faire appel aux fonctions de la DLL/LIB (je préférerais lié mon apli dynamiquement à une DLL, ça m'éviterait d'avoir à recompiler le projet à chaque fois qu'une nouvelle Dll est générée, mais bon, je me contenterais d'un truc qui marche dans un premier temps^^)

    Merci à tous.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Bonjour,

    La DLL est-elle dans le dossier du binaire généré (je ne connais pas Qt) ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oui, oui... par "désespoir", j'ai mis la DLL dans le dossier de l'exécutable générée, mais aussi la LIB, ainsi que la DLL et la LIB dans un répertoire Librairy dans le dossier ou se trouve l'exécutable...
    J'ai même été jusqu'à mettre ma DLL dans un dossier pointé par le PATH windows (j'ai pas parcouru le forum avent de poster...)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    C'est bizarre. D'après ce que j'ai lu, 0xc0000135 correspond à la macro STATUS_DLL_NOT_FOUND. Quitte à essayer des trucs crades, tu as essayé de la placer dans des dossiers système ? (genre C:\Windows\system32)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    C'est bien ce que j'avais cru comprendre, Dll not found... Je viens de tenter de la mettre dans C:\Windows\System32, l'histoire d'essayer, même résultat...
    J'avais aussi pensé à une incompatibilité C/C++ (la Dll étant compilé en C avec Visual 6, l'appli est C++ avec MinGW 4.4)
    Il y a bien un extern "C" sur le coté import, mais pas sur l'export des fonctions, l'export est bien fait correctement, vu que la DLL est utilisée par d'autres applis (mais d'autres applis compilés en VC6)...
    D'où mon incompréhension...

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

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

    Informations forums :
    Inscription : Juin 2014
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Détail auquel je pense aussi d'un coup...
    Une autre technique que j'ai testé, c'est l'utilisation de qLibrary.
    J'instancie bien mon objet, mais lorsque je tente de faire un load(), je reçois un retour négatif... (malgré le fait que la DLL est encore une fois bien présente...)

Discussions similaires

  1. communication avec une DLL ou ActiveX BOSCH
    Par Sjeuil dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 15/09/2014, 12h14
  2. Association d'une icone avec une dll
    Par ybruant dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 14/07/2005, 11h10
  3. [VB.NET] Problem de récupération de variable avec une DLL
    Par ludovic85 dans le forum Windows Forms
    Réponses: 11
    Dernier message: 19/01/2005, 11h37
  4. Appeler une API sans liaison avec une DLL
    Par mat.M dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 13/07/2004, 02h22
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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