Partage
  • Partager sur Facebook
  • Partager sur Twitter

créer un DLL en C++

    10 octobre 2007 à 11:46:38

    bonjour à toutes et à tous,
    je découvre et commence à tenter d'utiliser Code::Block
    ( windows XP ) et j'aimerais crééer une DLL.
    je prend donc "tel quel" le template proposé :

    Citation : code::block


    #include <windows.h>
    #ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
    #else
    #define DLL_EXPORT
    #endif
    void DLL_EXPORT SomeFunction(const LPCSTR sometext)
    { MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION); }
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    { switch (fdwReason)
    { case DLL_PROCESS_ATTACH: // attach to process
    break;
    case DLL_PROCESS_DETACH: // detach from process
    break;
    case DLL_THREAD_ATTACH: // attach to thread
    break;
    case DLL_THREAD_DETACH: // detach from thread
    break;
    }
    return TRUE; // succesful
    }


    je compile, tout est ok, mais en voulant enregistrer cette DLL
    ( regsvr32 sample.dll ou regsvr32 /i/n sample.dll )

    Citation : regsvr32


    sample.dll a été chargée mais le point d'entrée DllRegisterServer est introuvable.
    Ce fichier ne peut pas être enregistré.


    j'oublie probablement quelque chose,
    je n'ai pas compris la marche à suivre,
    je n'ai rien compris à rien...

    bref, si vous pouviez m'aiguiller, réponse, doc, exemple... ,
    ce serait gentil ( j'ai cherché mais pas trouvé,
    oui, oui, là aussi je suis nul )

    merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      10 octobre 2007 à 11:47:50

      à quoi çà te sert d'enregistrer ta DLL ? il faut l'enregistrer que les DLLs qui servent à windows (comme celle de genuine)
      • Partager sur Facebook
      • Partager sur Twitter
        10 octobre 2007 à 12:03:07

        pas compris la réponse.
        je suis sous windows XP :
        il ne faut pas l'enregistrer ?
        donc : je l'appelle comment cette SomeFunction
        dans un autre langage ? ( par exemple VB et JScript )
        @+
        • Partager sur Facebook
        • Partager sur Twitter
          10 octobre 2007 à 12:13:22

          "je n'ai rien compris à rien..."

          Programmer des dll nécessite d'exporter des points d'entrée.
          Quel est ton niveau en programmation ? Si tu es débutant, ne t'attaque pas aux dll.
          Dans quel but veux tu créer une dll ? Qu'est ce que tu veux faire avec ? Est ce vraiment nécessaire ? Pourquoi ne pas faire plutot un programme statique ?
          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            10 octobre 2007 à 12:30:32


            >>Quel est ton niveau en programmation ?
            faible. j'ai commencé à programmer il y
            à un peu plus de 40 ans, et je continue
            aujourd'hui.

            >>Si tu es débutant, ne t'attaque pas aux dll.
            zut alors, j'en use et en abuse avec d'autres
            langages. c'est si difficle en C++ ?
            Windows n'est-il pas essentiellement basé
            sur des DLL en C ?

            >>Dans quel but veux tu créer une dll ?
            >>Qu'est ce que tu veux faire avec ?
            j'utilise parfois J[ava]Script, par exemple,
            et quelques routines "orientées"
            plus "système" me simplifieraient la vie,
            il y a des fonctionnalités qui n'existent
            pas en J[ava]Script.
            ou, avec d'autres langages de programmation,
            qui doivent utiliser un ch'tite routine pointue
            ( temps de réponse... )

            je peux les faire ( simplement ) en VB
            mais j'aimerais que ces DLL soient plus
            autonomes avec C++

            >>Est ce vraiment nécessaire ?
            ben non. mais je ne vois pas
            comment faire autrement ( sauf avec
            un autre langage )

            >>Pourquoi ne pas faire plutot un programme statique ?
            comme dèjà dis, "routines système" à appeler
            dans d'autres langages.
            des programmes C++ statiques je sais faire,
            je cherche à aller un peu plus loin.

            Cordialement.
            • Partager sur Facebook
            • Partager sur Twitter
              10 octobre 2007 à 13:03:28

              Citation : bul


              >>Quel est ton niveau en programmation ?
              faible. j'ai commencé à programmer il y
              à un peu plus de 40 ans, et je continue
              aujourd'hui.



              Ah , je suis désolé si tu l'as mal pris, c'est qu'il arrive tellement souvent que des jeunes viennent demander un truc difficile, et qu'apres on se rende compte qu'ils s'attaquent a des choses compliquées sans connaitre la base.

              Bref, Visiblement, ta fonction n'est pas exportée correctement, essaie de mettre devant, un extern C :

              1. extern "C"
              2. void DLL_EXPORT SomeFunction(const LPCSTR sometext)
              3. {
              4. }
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                10 octobre 2007 à 13:15:01

                >>Ah , je suis désolé si tu l'as mal pris
                pas du tout.

                >>il arrive tellement souvent que des jeunes
                >>viennent demander un truc difficile,
                oh oui, même soucis dans d'autres langages
                que je possède un poil mieux.

                >>essaie de mettre devant, un extern C :
                je vais essayer, je tiens au courant.
                ça veut donc dire que regsvr32 est inutile ?

                EDIT : parce que je viens d'essayer avec #extern "C"
                et regsvr32 : même punition, même motif.
                RE Edit, je ne sais pas pourquoi le #, j'ai tenté sans : pareil.


                merci de ton aide.

                • Partager sur Facebook
                • Partager sur Twitter
                  10 octobre 2007 à 13:22:37

                  Tu compiles bien en "release" ?
                  Car sur pas mal de compilos, la compilation par defaut est en debug, et les résultats sont liés a des dll de debuggage. ça peut etre une des raisons.

                  ça fait longtemps que je n'ai pas fait de dll, si j'ai le temps, je verrai si je peut te trouver un exemple !

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                    10 octobre 2007 à 13:28:52

                    >>Tu compiles bien en "release" ?
                    je ne peux pas te dire

                    >>Car sur pas mal de compilos, la compilation par
                    >>defaut est en debug,
                    je vais vérifier comment c'est...
                    si je trouve où ça se paramètre !
                    je découvre code::block et c'est dans un patois
                    que j'entrave très mal ( l'américain je pense )

                    EDIT :
                    >>ça fait longtemps que je n'ai pas fait de dll,
                    on n'en fait pas tous les jours...
                    >>si j'ai le temps, je verrai si je peut te trouver un exemple !
                    ce serait extrèmement gentil.

                    @+

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      10 octobre 2007 à 13:58:00

                      Build->select target->
                      -Debug
                      -Release
                      Désolé, mais je ne peux pas t'aider plus que ça : je n'ai jamais fait de dll.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 octobre 2007 à 14:10:00


                        >>Désolé, e ne peux pas t'aider plus que ça :
                        >>je n'ai jamais fait de dll.
                        pas de raisons d'être désolé, hiura,
                        surtout que tu le fais ( m'aider ! )

                        et sur :
                        Build->select target->-Debug -Release
                        j'ai :
                        Build -> Select Target -> All ou Default
                        ( avec All coché )

                        @+
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 octobre 2007 à 20:13:52

                          Citation : regsvr32

                          sample.dll a été chargée mais le point d'entrée DllRegisterServer est introuvable.



                          Une DLL à plusieurs ou pas de points d'entrées,

                          entre autre le fameux
                          1. extern "C" HRESULT  __stdcall DllRegisterServer( void );


                          ainsi que ces larbins :
                          1. extern "C" HRESULT __stdcall DllGetClassObject(REFCLSID rclsid, REFIID
                          2. riid, LPVOID* ppv);
                          3. extern "C" HRESULT __stdcall DllCanUnloadNow(void);
                          4. extern "C" HRESULT __stdcall DllUnregisterServer(void)


                          Ce quadruplet de fonctions fait parti de l'interface COM, necessaire pour invoquer et utiliser des objets à partir d'une DLL et de l'enregistrer dans les registres.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 octobre 2007 à 5:11:51


                            merci Mattex,
                            on progresse, on progresse...

                            j'écris donc :

                            1. #include <windows.h>
                            2. #ifdef BUILD_DLL
                            3.    #define DLL_EXPORT __declspec(dllexport)
                            4. #else
                            5.    #define DLL_EXPORT
                            6. #endif
                            7. extern "C" HRESULT __stdcall DllRegisterServer( void );
                            8. extern "C" HRESULT __stdcall DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv);
                            9. extern "C" HRESULT __stdcall DllCanUnloadNow(void);
                            10. extern "C" HRESULT __stdcall DllUnregisterServer(void);
                            11. void DLL_EXPORT SomeFunction(const LPCSTR sometext)
                            12. {   MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);    }
                            13. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
                            14. {    switch (fdwReason)
                            15.    {  case DLL_PROCESS_ATTACH:         // attach to process
                            16.          break;
                            17.       case DLL_PROCESS_DETACH:         // detach from process
                            18.          break;
                            19.       case DLL_THREAD_ATTACH:          // attach to thread
                            20.          break;
                            21.       case DLL_THREAD_DETACH:          // detach from thread
                            22.          break;
                            23.    }
                            24.    return TRUE;   // succesful
                            25. }

                            mais... regsvr32 continue à refuser ,
                            avec le même message, le bougre...

                            j'ai mal interprété, retranscrit ce que tu disais ?

                            quelle patience il faut avoir avec les débutants !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 octobre 2007 à 5:58:39

                              il faut les définir pas juste les déclarer ;)


                              Il faut comprendre que COM utilise la base de registre windows pour que l'ordinateur comportant le composant sache quoi instancier et transporter lorsqu'on lui demande de créer l'instance de classe (on passe par son indentificateur unique : le CLSID (CLasS ID))

                              Alors il faut enregistrer les informations : P.S. je viens de revoir du vieux code et c'est assez compliqué à expliquer ici. De plus, je l'ai vue en même temps, le "extern "C"" n'est pas nécessaire.

                              Mais COM est largement compliqué sans cours...


                              voici un lien des laboratoire Microsoft pour implémenter aisément une DLL C++ en VB : http://www.laboratoire-microsoft.org/articles/dev/dll/
                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 octobre 2007 à 6:21:44


                                >>il faut les définir pas juste les déclarer
                                suis-je bête ! ( si,si )

                                merci pour le lien, je m'y précipite,
                                et si je ne comprend pas je reviendrais.
                                ( c'est une menace ! )

                                encore merci pour votre patience,
                                votre disponibilité. je reviendrais.

                                Cordialement.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                créer un DLL en C++

                                × 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