Partage
  • Partager sur Facebook
  • Partager sur Twitter

les problèmes DLL RESOLU!

code en c pour une DLL

Sujet résolu
Anonyme
    26 mars 2006 à 18:50:04

    BONJOURNO :D

    voici un petit code qui permet d'appeller une dll et d'utilisés ces fonctions:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>

    int main()
    {
    HINSTANCE madll; //variable qui stocke les infos de la DLL
    typedef int (*DLLSTART)(); /*pointeur de fonction ah! et joubliait !! si votre fonction renvoie un "int" mettez "int" si elle renvoie un "void" mettez "void" etc...*/
    DLLSTART fonction; //variable qui stocke les infos de la fonction

    madll = LoadLibrary("MasuperDLL.dll");
    /*on met la librairie en mémoire sans oublier d'enregistrer ces infos dans la variable madll*/

    fonction = (DLLSTART) GetProcAddress(madll, "mafonction");
    /*on met en mémoire la fonction contenue dans la DLL et on stocke ces informations dans la variable "fonction" et dans le pointeur de fonction "DLLSTART" */

    fonction();
    /*on appel la fonction contenue dans la dll, par l'intermédiare de la variable "fonction" qui par l'intermédiaire du pointeur de fonction ouvre la fonction contenue dans la DLL*/

    FreeLibrary(madll);
    //on libère la mémoire de la DLL
    }

    Mes commentaires sont peut être faux mais c'est le seul moyen que j'ai trouver pour dire a quoi sa sert :honte:

    après pour la creation de la dll elle même c'est hyper facile avec code::block
    de la crée il suffit de crée un projet "Dynamic Link Lbrary" et tout le code source de base de la DLL s'affiche il suffit alors de supprimer la fonction ecrite en C++ qui est juste après les lignes de preprocésseur et de la remplacer par votre ou vos fonctions.

    MAIS avant de partir une question:
    quelle type de pointeur de fonction est ceci:
    typedef int (*pointeurdemafonction)();

    j'ai finalement trouvé, cela permet de mettre le nom de pointeur comme un type
    qui, que, quand, on crée une variable avec le nom du pointeur elle a ces paramètres.
    autrement dit elle se change en pointeur de fonction avec ces paramètres a lui.

    mon code marche est comme je suis de bonne humeur je vous montre le code de la DLL si vous ête a ce point zero :p

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>

    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT
    #endif


    /*tout se qu'il a a modifier c'est de la*/
    int mafonction()
    {
        printf("i love you m@teO21 hahahahah dsl mon prog pete les plond");
    }
    /*jusqu'a là! c'est tout ! magique non? autrement dit c'est la que vous mettez vos fonctions:)*/


    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                break;

            case DLL_PROCESS_DETACH:
                break;

            case DLL_THREAD_ATTACH:
                break;

            case DLL_THREAD_DETACH:
                break;
        }
        return TRUE;
    }


    Bon la je vous est montrer comment charger une fonction situer dans une DLL
    maintenant a vous de trouver comment faire pour plusieurs fonctions!
    :p:p:p:p:p:p:p:p:p:p:p:p:p:p:p:p:p:p:p
    facile ou facile? :D

    Et oui vous l'aurez devinez il suffit simplement de reproduire la procédure
    Mais! si jamais vous avez le moindre problème sur mon code dite le moi !! je serai RAVI de savoir se qui a bugguer :D

    allez cette fois:

    @++ ciao merci d'avance et bon vent!
    :D:D:D
    • Partager sur Facebook
    • Partager sur Twitter
      26 mars 2006 à 19:59:06

      Ca a l'air bien ton code , même si je ne l'ai pas encore essaié ;)


      A++ ^^
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        27 mars 2006 à 8:10:29

        alors? :euh: comment vous trouvez le codes les autres? :o

        personne repond? :o:oo_O

        :'(

        a OUI ! j'avais aussi aussi une question esque quelqu'un connait une méthode pour
        importer un fichier image ou autres dans sont projet avec Code::Blocks ? :euh:
        Si oui , comment exploiter ce fichier après importation ? :euh:

        Merci d'avance :D
        • Partager sur Facebook
        • Partager sur Twitter
          27 mars 2006 à 11:08:53

          Tu peux faire la meme chose de facon portable avec SDL....
          Va voir du côté de SDL_loadso
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            27 mars 2006 à 12:21:42

            aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! o_Oo_O
            interressant! sa MERCIalors! :D:D
            • Partager sur Facebook
            • Partager sur Twitter
              27 mars 2006 à 14:57:48

              pense a metre le sujet en tant que resolu c'est en bas de la page entre
              Image utilisateur
              et
              Image utilisateur
              • Partager sur Facebook
              • Partager sur Twitter
                27 mars 2006 à 19:04:31

                BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
                {
                    switch (fdwReason)
                    {
                        case DLL_PROCESS_ATTACH:
                            break;

                        case DLL_PROCESS_DETACH:
                            break;

                        case DLL_THREAD_ATTACH:
                            break;

                        case DLL_THREAD_DETACH:
                            break;
                    }
                    return TRUE;
                }

                A quoi sert la fin du code ??? o_O
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  28 mars 2006 à 0:33:21

                  Franchement je ne sais pas mais je te conseil fortement de laisser ceci
                  pour que ta DLL fonctionnne ;)

                  Sinon dit moi ta comprit le principe? ^^
                  Ta essayer et sa a marcher? ^^
                  Tu serai en faire une a ta sauce a partir de cette exemple? ^^
                  (et ses expliquations :D:-° )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mars 2006 à 7:28:42

                    J'ai pas trop bien compris non plus à quoi il sert ce code, mais je pense que c'est comme la boucle des messages Win32, quant à savoir ce que signifie les messaes ça doit être quand la DLL est liée puis déliée au programme.
                    Pour faire des dll portables (je sais pas si ya d'autres moyens, j'ai toujours fait comme ça)
                    dll.c

                    #include <stdio.h>
                    int my_function ()
                    {
                        printf("DLL is speaking !");
                        return 0;
                    }
                    // je me souviens plus du symboles exact pour windows,faudrait aller voir du coté de SDL
                    #ifdef WIN32
                    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
                    {
                        switch (fdwReason)
                        {
                            case DLL_PROCESS_ATTACH:
                                break;

                            case DLL_PROCESS_DETACH:
                                break;

                            case DLL_THREAD_ATTACH:
                                break;

                            case DLL_THREAD_DETACH:
                                break;
                        }
                        return TRUE;
                    }

                    #endif /* Win32 */


                    dll.h

                    #ifdef WIN32
                    #  ifdef BUILD_DLL
                    #    define DLL_EXPORT __declspec(dllexport)
                    #  else
                    #    define DLL_EXPORT
                    #  endif
                    #else
                    #  define DLL_EXPORT
                    #endif

                    int my_fonction ();


                    Pour la compilation souswindows laissez faire votre IDE c'est assez complexe, sous linux suffit de rajouter -so mais je sais plus ou :X

                    Utilisation :
                    Une DLL s'utilise de deux facon :
                    - Statique : Comme pour la SDL, toutes les fonctions sont chargées, il suffit de rajouter comme option à gcc -lTaDLL. Cependant sous windows, il y a création d'un fichier .a très très important qui sert au linkage statique.
                    main_statique.c

                    #include "dll.h"
                    #include <stdio.h>
                    int main ()
                    {
                       my_function ();
                       getchar ();
                       return 0;
                    }


                    - dynamique : le principe : rien n'est chargé, vous avez besoin d'une fonction ? Vous la chargez vous meme.
                    main_dynamique.c

                    #include <SDL/SDL_loadso.h>

                    int main ()
                    {
                       InitSDL ( 0 );
                       // ou TaLIB.so sous linux
                       void* handle_dll  = SDL_LoadObject ("TaLib.dll");
                       int (*fonction) = SDL_LoadFUnction (handle_dll,"my_function");
                       fonction ();
                       SDL_UnloadObject (handle_dll);
                       SDL_Quit ();
                    }


                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 mars 2006 à 16:47:09

                      Moi j'ai testé le code , et ça foncionne super bien ;)


                      A++ ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        28 mars 2006 à 16:50:59

                        MIIIICIIII!!! :):):)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          7 juin 2006 à 17:57:50

                          je le remet en 'avant' pour que tout le monde admire :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 juin 2006 à 18:30:10

                            T'a qu'à faire un tuto :p
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              8 juin 2006 à 8:21:32

                              aaaa pas mal comme idee ok je mit lance :D
                              • Partager sur Facebook
                              • Partager sur Twitter

                              les problèmes DLL RESOLU!

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown