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 :

Accés au fonction d'une DLL


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Accés au fonction d'une DLL
    Bonjour,

    J'ai fait une DLL en C++ en utilisant Borland Developper Studio 2006.

    J'aimerais maintenant accéder à cette DLL avec une autre application C++ faite en BDS 2006. Je voudrais faire une importation dynamique

    Je tape le code suivant que j'ai trouvé dans un tutoriel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    HINSTANCE hinstDLL;
    MYDLLFUNC ImpFuncDLL;
    int iRet;
     
    if ((hinstDLL=LoadLibrary("Project1.dll"))) {
    ImpFuncDLL = GetProcAddress(hinstDLL, "LoadForm");
    if (ImpFuncDLL) {
       iRet = ImpFuncDLL();
       }
    FreeLibrary(hinstDLL);
    }
    Le problème est qu'a la ligne if ((hinstDLL=LoadLibrary("Project1.dll"))), la valeur retournée par la fonction LoadLibrary est égale à null.

    Je suis sur que le chemin de la DLL est correct et j'ai essayer plusieurs variante de points d'entrées.

    J'ai le même problème que je fasse une application console ou une application VCL.

    J'ai essayé avec une DLL prise au hasard dans windows, cela fonctionnne.

    Avec une application Delphi j'arrive a accéder à ma DLL sans problème.

    Est ce que quelqu'un a déjà eu ce problème ? De quoi cela peut il venir ? Faut il rajouter quelque chose dans la DLL ?

    Merci



    balises [code] rajoutées par r0d. Merci d'y penser dorénavant.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu peux vérifier le code d'erreur avec GetLastError, tu auras peut-être plus d'informations.

    Assure-toi également que le point d'entrée de la DLL n'est jamais appelé (il pourrait être appelé mais renvoyer une valeur incorrecte qui ferait échouer le chargement).

  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
    Vérifie également le nom réel de la fonction: Sous Windows, les noms de fonctions sont également décorés en C (mais beaucoup moins qu'en C++).

    Edit: Oups, à-côté de la plaque
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    salut,
    as-tu essayé de mettre le chemin complet de ta DLL ?

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    Vérifie également le nom réel de la fonction: Sous Windows, les noms de fonctions sont également décorés en C (mais beaucoup moins qu'en C++).
    Oui mais là c'est sur le LoadLibrary() qu'il y a un problème, pas sur l'appel d'une fonction.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 15
    Par défaut Emplacement de la DLL
    Merci à tous pour vos réponse

    Si je place la DLL dans le répertoire System32 ou dans

    C:\Program Files\Borland\BDS\4.0\Bin

    Alors la fonction LoadLibrary() retourne une valeur qui n'est pas null

    Juste une question : Est ce que c'est normal et c'est moi qui n'avait pas vu qu'il fallait placer la DLL à l'un de ces emplacements ou bien est ce que c'est quand même bizarre ?

    Si j'essaye avec le chemin complet de la DLL placé n'importe où cela ne fonctionne pas.

    J'ai également essayer de modifier la variable d'environnement PATH pour lui ajouter le répertoir de ma DLL, mais cela ne fonctionne pas.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je pense que tu dois avoir un soucis avec les chemins (path) sous windows. Il ne faut pas écrire
    "c:/undossier/madll.dll"
    ni
    "c:\undossier\madll.dll"
    mais
    "c:\\undossier\\madll.dll"

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Par ailleurs, pour la robustesse de ton code, il pourrait être bien de vérifier si le fichier de la dll existe avant de le charger. Pour ce faire, FAQ C++

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je pense que tu dois avoir un soucis avec les chemins (path) sous windows. Il ne faut pas écrire
    "c:/undossier/madll.dll"
    Complétement pas, ça passe très bien.
    "c:\\undossier\\madll.dll" ne sert qu'à avoir un code non portable

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par bridy224
    Juste une question : Est ce que c'est normal et c'est moi qui n'avait pas vu qu'il fallait placer la DLL à l'un de ces emplacements ou bien est ce que c'est quand même bizarre ?
    La recherche d'une libraire (quand aucun '\' n'est présent) se fait en cherchant (et dans cet ordre):
    - Dans le répertoire de chargement du processus (celui du .exe)
    - Dans le répertoire système
    - Dans le répertoire windows
    - Dans le répertoire courrant
    - Dans les répertoires indiqués dans la variable d'environnement 'PATH'.


    Citation Envoyé par bridy224
    Si j'essaye avec le chemin complet de la DLL placé n'importe où cela ne fonctionne pas.
    Ca par contre, c'est très étrange. Parceque je peux garantir que cela fonctionne très très bien. Je pense qu'effectivement, là, tu as un problême de chemins.
    A noter que LoadLibrary ne *gère pas* les chemins avec '/' (forward slash). Il faut impérativement utiliser des chemins windows.

    Citation Envoyé par bridy224
    J'ai également essayer de modifier la variable d'environnement PATH pour lui ajouter le répertoir de ma DLL, mais cela ne fonctionne pas.
    Là aussi ca devrait marcher (voir ci-dessus).

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A noter que LoadLibrary ne *gère pas* les chemins avec '/' (forward slash). Il faut impérativement utiliser des chemins windows.
    Tiens oui... C'est idiot, Windows gère très bien les slashs avec d'autres fonctions.

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 643
    Par défaut
    Salut,
    Citation Envoyé par Laurent Gomila
    Tiens oui... C'est idiot, Windows gère très bien les slashs avec d'autres fonctions.
    Oui, mais bon... le jour où microsoft deviendra logique, mon chien marchera sur les pattes de devant

    bon...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Acces aux fonctions d'une DLL par code VBA
    Par GlamIS dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 22/09/2010, 15h59
  2. Appel de fonction d'une DLL en TANSAC SQL
    Par sylvain114d dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/01/2006, 10h21
  3. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  4. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57
  5. [VB6] Ajouter un commentaire à une fonction d'une DLL
    Par Ace303 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 05/06/2003, 08h14

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