none
Comment charger une dll sous visual Studio? RRS feed

  • Question

  • Je crois que j'ai tout dis dans la question? Car j'ai seulement une dll "freeglut.dll", mais elle ne contient aucun fichier .h ou .lib juste la dll. Et je ne connait pas la méthode pour importer une dll.
    mercredi 23 juillet 2008 09:18

Réponses

  • Bonjour,

     

    Voici un exemple d'appel d'une fonction d'une DLL (par exemple l'appel de la fonction glutInitWindowPosition) :

     

    Code Snippet

    #include "stdafx.h"
    #include <windows.h>

     

    typedef void (*pointeurSur_glutInitWindowPosition) ( int x, int y );

     

    int main(int argc, _TCHAR* argv[])

    {

    HMODULE module;

    module = LoadLibrary(L"freeglut.dll");
    if (module == NULL)

    {

    //Message d'insulte avec GetLastError()

    }

     

    pointeurSur_glutInitWindowPosition fonc;
    fonc = (pointeurSur_glutInitWindowPosition)GetProcAddress(module, "glutInitWindowPosition");

     

    if (fonc == NULL)

    {

    //Message d'insulte avec GetLastError()

    }

     

    //Appel de la fonction

    fonc(30, 60);

    //autant de fois que l'on veut

    fonc(16, 64);

     

    //Ne pas oublier la libération de la DLL

    FreeLibrary(module);

     

    return 0;

    }

     

     

    Cordialement

    lundi 18 août 2008 10:23
    Modérateur

Toutes les réponses

  • Bonjour,

     

    Je pense que cette dll est natif, il faudra dans ce cas appeller la méthode LoadLibrary()

    http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx

    et GetProcAddress() pour obtenir l'addresse d'un fonction dans cette DLL.

    http://msdn.microsoft.com/en-us/library/ms683212(VS.85).aspx

     

    Cordialement

     

    mercredi 23 juillet 2008 11:56
    Modérateur
  • Merci de m'avoir répondu.  Et désolée de t'avoir pas répondu plus tôt, car en ce moment je suis trop débordé.

    Voilà ce que je rajoute:

    Code Snippet

    LoadLibrary(L"freeglut.dll");



    Après je fait appelle à la fonction que j'ai besoin :

    Code Snippet

    extern "C" __declspec(dllimport) void glutInit(int *argc, char **argv);



    Après en je met la fonction dans le main:



    int main(int *argc, char **argv)

    {


    glutInit(int *argc, char **argv);

    }

    En le compilant pour savoir si je ne possède pas d'erreur, j'en trouve trois :

    Erreur    3    error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque : C++ ne prend pas en charge int par défaut
    Erreur    4    error C2365: 'LoadLibraryW' : redéfinition ; la précédente définition était 'fonction'   
    Erreur    5    error C2440: 'initialisation' : impossible de convertir de 'const wchar_t [18]' en 'int'



    Pour l'instant je cherche dans l'aide msdn, mais c'est toujours sans réponse
    jeudi 14 août 2008 22:39
  • Bonjour,

     

    Est- il possible que vous puissiez indiquer précisement les lignes associées aux messages d'erreurs du compilateur.

     

    Cordialement

     

    vendredi 15 août 2008 12:32
    Modérateur
  • Bien sûr, j'ai réussi à corriger une erreur en faisant :

    LPCWSTR LoadLibrary(L"freeglut.dll");

    au lieu de :


    LoadLibrary(L"freeglut.dll");


    Donc Erreur 5 : OK

    Erreur 3 : Disparu en redémarrant mon pc ou visual Studio.

    Et Erreur 4 : Provient de la fonction

    LoadLibrary(L"freeglut.dll):

    Par contre ce que je comprend pas c'est l'erreur 3 qui est survenu, puis disparaît .


    vendredi 15 août 2008 21:00
  • Bonjour,

     

    Est-il possible que vous puissiez m'envoyer votre code source (du moins le fichier qui pose problème) sur gilles.tourreau@pos.fr ?

     

    Cordialement

     

    dimanche 17 août 2008 18:33
    Modérateur
  • Bonjour,

     

    Voici un exemple d'appel d'une fonction d'une DLL (par exemple l'appel de la fonction glutInitWindowPosition) :

     

    Code Snippet

    #include "stdafx.h"
    #include <windows.h>

     

    typedef void (*pointeurSur_glutInitWindowPosition) ( int x, int y );

     

    int main(int argc, _TCHAR* argv[])

    {

    HMODULE module;

    module = LoadLibrary(L"freeglut.dll");
    if (module == NULL)

    {

    //Message d'insulte avec GetLastError()

    }

     

    pointeurSur_glutInitWindowPosition fonc;
    fonc = (pointeurSur_glutInitWindowPosition)GetProcAddress(module, "glutInitWindowPosition");

     

    if (fonc == NULL)

    {

    //Message d'insulte avec GetLastError()

    }

     

    //Appel de la fonction

    fonc(30, 60);

    //autant de fois que l'on veut

    fonc(16, 64);

     

    //Ne pas oublier la libération de la DLL

    FreeLibrary(module);

     

    return 0;

    }

     

     

    Cordialement

    lundi 18 août 2008 10:23
    Modérateur
  • Bonjour,

     

    votre méthode permet d'utiliser les fonctions d'une DLL. Admettons maintenant que la Dll contient une classe possédant des attributs publics. Comment fait-on alors pour modifier la valeur de ces attributs lorsqu'on a instancié un objet de cette classe ? Sachant qu'aucun getter et setter ne sont présents ...

    jeudi 22 juillet 2010 09:05
  • Là, c'est plus de l'utilisation d'une API C qui ne propose que des fonctions avec un "mangling" standard mais d'une API en C++ utilisant un mangling "C++" qui n'est pas standardisé.

    Il vous faudra utiliser le même compilateur, voir la même version, que celui qui a servi à compiler le Dll.

    Si vous avez cette information, vous avez vraisemblablement la documentation, le .h et le .lib.

    Votre question est-elle théorique, dans ce cas il existe un certain nombre de méthodes heuristiques et d'outils pour créer des .h et .lib à partir d'une dll.

    Si c'est un cas pratique, regardez avec dependency walker (http://dependencywalker.com/) les exports de la Dll, et si l'API de la Dll a été un minimum correctement conçue, vous devriez avoir tous les accesseurs nécessaires.


    Paul Bacelar, Ex - MVP VC++
    jeudi 22 juillet 2010 12:15
    Modérateur