Résultats de 1 à 2 sur 2

Sujet : [dll][Windows] Appel d\'une fonction en C

  1. #1
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823

    [dll][Windows] Appel d\'une fonction en C

    [dll][Windows] Appel d\'une fonction en C

    On pose parfois la question sur la façon d\'appeler une fonction située dans une Dll depuis un programme personnel.
    Ce nouveau Thread fait suite a la question de Cako19 qui semble avoir des difficultées a réaliser cette manipulation. ( voir : http://www.forum.moteurprog.com/index.php?url=FORUM_msg.php&ID_topic=636@C+%26 +C%2B%2B )

    Pour illustrer le principe, j\'ai créé deux petits projets dans Visual Studio.
    L\'un contient le code de la dll et bien sur l\'autre le code d\'un programme faisant l\'appel a une fonction contenue dans cette dll.

    Le projet Dll ne presente pas de structure compliquée juste une fonction qui a partir d\'un int renvoie celui ci multiplié par deux (pas de quoi casser des briques en somme).
    pas de code particulier dans la DllMain qui ne fait rien si ce n\'est de renvoyer un boolean TRUE.

    Code:
    #include \"stdafx.h\"
    #include \"Dll.h\"
    
    
    extern \"C\" __declspec(dllexport) int Double(int);
    
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
                              )
    {
        switch (ul_reason_for_call)
         {
              case DLL_PROCESS_ATTACH:
              case DLL_THREAD_ATTACH:
              case DLL_THREAD_DETACH:
              case DLL_PROCESS_DETACH:
                   break;
        }
        return TRUE;
    }
    
    
    
    DLL2_API int Double(int X)
    {
         return X*2;
    }
    Apres compilation un rapid coup d\'oeuil a la dll avec l\'outils Depend ( C:\\Program Files\\Microsoft Visual Studio\\Common\\Tools\\DEPENDS.EXE ) me confirme la presence de ma fonction dans la dll nouvellement compilée.
    Ordinal Hint Function Entry Point
    1(0x0001) 0(0x0001) Double 0x0000100A
    pour la facilité cette dll est ensuite copiée sur la racine du disque C.

    Pour l\'appel Même combat, rien d\'extraordinaire, dans le main, les operations de chargement et de recherche de la fonction, suivies de l\'appel.

    Code:
    #include \"stdafx.h\"
    #include \"windows.h\"
    
    int main(int argc, char* argv[])
    {
         printf(\"Hello Dll World !\\n\\n\");
         int i = 10;
         
         {
         HINSTANCE      hInstLib ;
         int (WINAPI *Double)(int) ;
         
         // Chargement de la DLL en mémoire
         hInstLib = LoadLibraryA( \"c:\\\\dll.dll\" ) ;
         if(hInstLib == NULL )
            {
                printf(\"Impossible de charger la Dll!\\n\");
                return 1; // Sortie sur erreur
            }
    
         // Recuperation de la fonction
         Double=(int(WINAPI *)(int))GetProcAddress( hInstLib,\"Double\" ) ;
         if(Double == NULL )
            {
                printf(\"Impossible de trouver la methode!\\n\");
                FreeLibrary( hInstLib ) ;
                return 1; // Sortie sur erreur
            }
    
         printf(\"I = %u\\n\",i);
         i = Double(i);
         printf(\"I = %u\\n\\n\",i);
         FreeLibrary(hInstLib);
         }
         return 0;
    }
    Le resulta à l\'ecran est previsible et nous n\'avions pas besoin de tout ce code pour le calculer

    Hello Dll World !

    I = 10
    I = 20
    Et voila, le principe reste bien sur le même si vous desirez appeler une autre dll dont vous connaissez la signature.

    Dans un temps trés prochain, j\'essaierai de montrez cet appel depuis VB6 et aussi les possibilitées liées au clonage/renomage d\'une dll existante.

    Affaire a suivre donc. :wink:

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Example VB disponible ici :

    http://www.forum.moteurprog.com/index.php?url=FORUM_msg.php&ID_topic=979@C+%26 +C%2B%2B@1

    :wink:

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé