begin process at 2008 08 21 19:23:08
1 229 610 membres
423 nouveaux aujourd'hui
14 263 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CHARGEMENT DYNAMIQUE D'UNE DLL


Information sur la source

Catégorie :Divers Classé sous : chargement, dynamique, dll Niveau : Débutant Date de création : 09/03/2003 Date de mise à jour : 25/10/2005 15:14:11 Vu : 9 985

Note :
4 / 10 - par 1 personne
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


Description

Se trouve aussi ici: http://www.dev.winsysdev.com/

Voici un exemple de code en C vous permettant de charger dynamiquement une DLL dans votre programme (si par exemple vous n'avez pas le .lib de la DLL).

Dans l'exemple j'ai pris le cas d'une DLL __sdtcall mais vous pouvez bien sur utiliser __cdecl.

Source

  • // Chargement dynamique d'une DLL
  • int hModDll;
  • hModDll = (int)LoadLibrary("madll.dll");
  • if ((int)hModDll < 32) MessageBox(GetActiveWindow(),"Erreur lors du chargement de la DLL.","Erreur",0);
  • typedef int (__stdcall* lpFunc1) (protype de la fonction);
  • lpFunc1 Func1;
  • Func1 = (lpFunc1) GetProcAddress((HINSTANCE)hModDll, "NomDeLaFonctionDansLaDLL");
  • int retour;
  • retour = ((Func1)(mes arguments));
  • // On décharge la DLL de la mémoire.
  • FreeLibrary(hModDll );
// Chargement dynamique d'une DLL
int hModDll;
hModDll = (int)LoadLibrary("madll.dll");
if ((int)hModDll < 32) MessageBox(GetActiveWindow(),"Erreur lors du chargement de la DLL.","Erreur",0);

typedef int (__stdcall* lpFunc1) (protype de la fonction);
lpFunc1 Func1;

Func1 = (lpFunc1) GetProcAddress((HINSTANCE)hModDll, "NomDeLaFonctionDansLaDLL");

int retour;

retour = ((Func1)(mes arguments));

// On décharge la DLL de la mémoire.
FreeLibrary(hModDll );

Conclusion

Enjoy !
25 octobre 2005 15:14:11 :
Se trouve aussi ici: http://www.dev.winsysdev.com/
  • signaler à un administrateur
    Commentaire de Kaid le 09/03/2003 19:13:45

    - Pourquoi tu castes le handle retourné par LoadLibrary() en int ?

    - A quoi correspond le '32' dans ton test avec LoadLibrary() ?

  • signaler à un administrateur
    Commentaire de Haldwin le 09/03/2003 21:20:08

    Salut,

    Je voulais aussi savoir pourquoi tu as casté le Handle en int?

    Et puis juste une petite rectification lorsque tu dis dans l'entête: "chargement dynamique d'une Dll" il vaut mieux dire simplement "chargement d'une Dll" car Dll veut dire "dynamic link library".
    Mis à part ça, c'est une source utile pour ceux qui ne connaissent pas l'utilisation d'une Dll...
    Bon dev,
    &lt;&lt;-- H@ldwin --&gt;&gt;

  • signaler à un administrateur
    Commentaire de BruNews le 10/03/2003 00:45:40 administrateur CS

    Salut,
    c'est un bon depart.
    Vire le 32, c'est pour test de ShellExecute().
    Simplrement:
    if((hModDll = LoadLibrary("madll.dll")) == NULL) ERRATO;
    ciao...

  • signaler à un administrateur
    Commentaire de Viper31 le 15/03/2003 14:38:23

    question de curiosité , quel bibliotheque a inclure ? windows.h ?
    c'est juste parce que j'en sais rien et que ce bout de code pourrait me servir plus tard , quand j aurai compris le fonctionnement des DLL ;) !!

    Tchô

  • signaler à un administrateur
    Commentaire de BruNews le 15/03/2003 14:45:34 administrateur CS

    #include &lt;windows.h&gt;  // TOUJOURS

  • signaler à un administrateur
    Commentaire de LordBob le 23/12/2003 19:30:35

    Bonjour, je viens de tomber sur cette source car je cherche le moyen de charger une dll de facon dynamique... Mais pourriez-vous m'expliqué ce qu'est une DLL __sdtcall et une DLL __cdecl?

  • signaler à un administrateur
    Commentaire de BruNews le 23/12/2003 19:35:24 administrateur CS

    __sdtcall, __cdecl, __fastcall sont les conventions d'appel qui determinent comment sont passes les parametres des fonctions. Ceci n'est pas specifique aux DLLs.
    Regarde MSDN sur le sujet.

  • signaler à un administrateur
    Commentaire de CyberP le 29/01/2004 18:42:15

    euh j'ai juste un problème : je met une dll __cdecl avec le même script que là haut, ca fait une erreur mais si on fait ignorer ca marche... je fais la même chose avec une dll __stdcall ca ne fait plus d'erreur mais après l'instruction

    Func1 = (lpFunc1) GetProcAddress((HINSTANCE)hModDll, "NomDeLaFonctionDansLaDLL");

    Func1 est égal à NULL... Pourquoi ? (note : j'ai posé une question sur le forum on m'a pas répondu correctement donc je demande ici)

  • signaler à un administrateur
    Commentaire de BruNews le 29/01/2004 19:20:36 administrateur CS

    Si Func1 == NULL c'est que ce point d'entree n'a pas ete trouve.
    C'est une question de decoration des noms produit par les compilos C++. Il faut toujours forcer leur NON decoration par un:
    extern "C" devant l'implem de la fonction dans le code de la dll.
    Idem dans le h si on s'en sert pour un linkage statique.

  • signaler à un administrateur
    Commentaire de CyberP le 30/01/2004 17:38:49

    Bon, j'ai tout mis en __cdecl et ca fonctionne... Mais je ne comprends toujours pas ce qui avait pu se passer...

    Le prototype de ma fonction était :
    extern "C" __declspec(dllexport) int DllFunctionList(char***& list)

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS