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 :

utilisation de dll avec diverses compilateurs


Sujet :

C++

  1. #21
    DoDoT
    Invité(e)
    Par défaut
    Perso j'ai une DLL écrite en C dont j'ai la source, qui m'a été livrée avec une fichier .H, et que j'utilise dans un programme C avec Borland C++ 5. Dans mon fichier .DEF j'ai bien toutes les fonctions de la DLL mais au linkage j'ai l'impression qu'il ne les retrouve pas dans le fichier .LIB... Donc j'ai des Unresolved External... Je dois bidouiller avec des stdcall ou je dois recompiler la DLL ?

  2. #22
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Plusieurs points :
    - Des méthodes "extern C" sont exportées "en clair" dans les DLL (sans mangling C++ - spécifique à chaque compilateur) et donc sont exploitables facilements...

    - Le fichier include permet de connaitre leur syntaxe (donc c'est plutôt utile !)

    - Attention le fichier LIB est par contre spécifique à chaque compilateur donc si la DLL est compilée avec Visual C++ par exemple, le LIB générée n'est pas compatible avec Borland...

    - Par contre il est possible de générer un fichier LIB à partir d'une DLL (programme IMPLIB présent dans le répertoire du compilateur Borland)

    - les "stdcall" et autres "cdecl" permettent de préciser la convention d'appel des paramètres (L'ordre de passage des paramètres sur la pile), elle doit évidement être la même entre la DLL et le client de la DLL...

    Voilà si cela peut depanner...

  3. #23
    DoDoT
    Invité(e)
    Par défaut
    Bon en fait j'utilise un fichier LIB que j'ai généré mais ca ne marche pas. J'ai remarqué que dans mon .DEF les fonctions étaient en majuscules, contrairement au .H, donc j'ai essayé et hop il les a trouvées dans le .LIB mais maintenant il me dit que la DLL est corrompue... J'ai son code source, donc j'ai essayé de la recompiler mais bien sur ca marche pas, j'en suis la... Et dire que c'est un produit commercial...

  4. #24
    DoDoT
    Invité(e)
    Par défaut
    J'ai réglé mon probleme c'était bien la DLL qui était corrompue !

  5. #25
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    si l'anglais ne vous effraye pas trop
    jettez un coup d'oeil ici
    http://www.bcbdev.com/articles/vcdll.htm
    et la
    http://www.bcbdev.com/articles/bcbdll.htm

    Cordialement

  6. #26
    Membre du Club
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Points : 43
    Points
    43
    Par défaut
    salut.

    En effet comme il a ete signalé le probleme est 1pb de décortaion de fonctions. Pour simplifie les choses, les methodes des class c++ sont traduite en fonctions c mais comme aucune normalistion sur la traduction des fichier obj n'existeles dll resulatant ne peuvent etre portable. Pour s'en convincre il suffit d'utilser le programme depend.exe outil de chez microsoft (disponible su vs et borland c++) se dernier n'arrive pas reconnaitre les methodes c++.

    a+

  7. #27
    mat.M
    Invité(e)
    Par défaut
    Salut,

    Je développe actuellement avec C++Builder 6 et je suis confronté à un problème : je voudrais utiliser des dll que mon collègue compile avec le compilateur d'IBM, mais lorsque je fait la bibliothèque d'importation (.LIB) avec l'utilitaire IMPLIB, mon compilateur lors du link n'arrive pas à faire trouver la fonction dans le LIB.
    A cela, j'ai trouvé un début de solution qui est de déclarer les fonctions en __stdcall. Mais cette solution n'est pas envisageable avec des fonctions C++ surchargées, le compilateur nous jette.
    Alors, ce que je vous demande c'est s'il faut mettre un autre type de conventions devant les fonctions ou s'il y a d'autres solutions.
    *Le Greg a tout dit
    * construire une DLL Active X COM
    *COM c'est justement conçu pour cela
    *la DLL pourra être exploitée par n'importe quel environnement qui supporte COM ( Delphi , VB , VC++.....)
    Le problème: il faut que la plateforme IBM puisse supporter OLE / COM

  8. #28
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Il suffit d'importer la fonction de la dll, le seul problème est qu'il faut connaître le prototype de la fonction, donc pour importer une fonction de type void qui prend un char * et un int en param vous devrez faire comme tel:

    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
     
    #include <iostream>
     
    #pragma comment ( lib, "LaLib.lib" )
     
    using namespace std;
     
    extern "C" __declspec( dllimport ) void LaFonctionDsDll( char *, int );
     
    int main ( void )
    {
    	// vous pouvez utiliser la fonction comme vous le voulez...
    	LaFonctionDsDll( "test", 1 );
     
    	return 0;
    }
    Je crois que ce n'est pas trop compliqué... !!!!

    Bonne prog, et si vous avez encore des problèmes, envoyer moi un pti MP, ou mail

  9. #29
    Membre habitué
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Points : 125
    Points
    125
    Par défaut
    Salut!

    DmXx: il y a un problème de name mangling avec C++ et tu nous sors
    un extern "C"!

    Sinon, je passais juste par là pour demander s'il existe (ou non...) un "changeur" de libraries statiques MSVC en libraries statiques BCC.

  10. #30
    Candidat au Club
    Inscrit en
    Mars 2004
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    J'ai qq difficultés à utiliser des fonctions définies dans un fichier .dll surtout lorsqu'elle prenne des arguments en entrée.

    Je souhaite par exemple me servir de la fonction suivante définie comme suit:

    extern "C" DllFunc BOOL __cdecl USB_ReadFile(PVOID,DWORD,LPDWORD,ULONG);

    Cette fonction prend 4 arguments en entrée et me ressort un booléen. Elle est définie dans un fichier nommé "XtlUsb.dll".


    Voici le code développé conformément à l'aide MSDN:

    typedef BOOL (WINAPI* USB_ReadFile)(PVOID,DWORD,LPDWORD,ULONG);

    USB_ReadFile pUSB_ReadFile;

    char chBuffer[66000];
    PVOID *lpBuffer = 0;
    DWORD nNumberOfBytesToRead = 65536;
    LPDWORD lpNumberOfBytesRead = 0;
    ULONG Timeout = 5000;

    hDLL = LoadLibrary("XtlUsb.dll");
    if (hDLL != NULL)
    {
    pUSB_ReadFile = (USB_ReadFile)GetProcAddress(hDLL,"USB_ReadFile");
    if (!pUSB_ReadFile)
    {
    FreeLibrary(hDLL);
    }
    else
    {
    BOOL BResult = TRUE;
    BResult = pUSB_ReadFile(lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,Timeout);
    }
    }


    Je n'ai aucune erreur à la compilation. Par contre j'ai une erreur fatale au cours de l'exécution du programme à la ligne suivante:
    BResult = pUSB_ReadFile(lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,Timeout);

    Auriez-vous une idée sur l'origine de cette erreur?
    D'avance merci ;-)

  11. #31
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    salut !
    J'ai également un problème pour inclure des .dll dans un projet sous Borland C++ version 5. Quel est le code à écrire ou la manip à faire ?
    Sinon, j'ai lu que l'on pouvait transformer des .dll en .lib, mais quel est le code exactement ?
    Merci d'avance

Discussions similaires

  1. Utilisation des DLL avec c#.
    Par fred61 dans le forum C#
    Réponses: 5
    Dernier message: 30/06/2011, 11h37
  2. Utiliser des DLL avec NetBeans
    Par JeanNoel53 dans le forum NetBeans
    Réponses: 1
    Dernier message: 27/12/2010, 15h28
  3. Utilisation des Dll avec MATLAB 2007b
    Par halimi dans le forum MATLAB
    Réponses: 7
    Dernier message: 21/01/2009, 15h29
  4. Eclipse : utiliser une DLL avec un plugin view
    Par cloporte dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 04/09/2007, 09h36
  5. [FORMS] Utilisation de DLL avec ORA_FFI
    Par Nounoursonne dans le forum Forms
    Réponses: 2
    Dernier message: 07/12/2004, 09h19

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