IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Bibliothèques dynamiques] Point d'entrée d'une DLL DLLRegisterServer


Sujet :

C++

  1. #1
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut [Bibliothèques dynamiques] Point d'entrée d'une DLL DLLRegisterServer
    Salut,

    J'ai une dll C++ que je n'arrive pas à enregistrer dans la base de registre. J'utilise cette dll depuis plusieurs programmes et je dois toujours leur indiquer le chemin absolu.


    Je sais qu'il faut ajouter quelques part la fonction d'enregistrement DLLRegisterServer mais je ne vois pas comment faire ni où l'ajouter.

    J'avoue que le C++, j'en ai jamais fait.

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    On n'enregistre une DLL avec DllRegisterServer() que si la DLL en question est un composant COM.
    Une DLL ordinaire ne s'enregistre pas (sauf les DLLs partagées, pour les programmes d'installation, mais je crois que ça ne change rien au coup du chemin). Par contre, tu peux ajouter le répertoire la contenant à la variable d'environnement PATH.

  3. #3
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    Idéalement il faudrait que ça soit une DLL COM mais je ne vois pas comment créer en C++. Y a-t-il quelque chose à ajouter dans le code ou dans les options de compilations pour lui dire que c'est une dll Com?

    Merci d'avance

  4. #4
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    En effet il y a des choses a faire.
    Quand on crée un projet ATL COM avec Visual, il ajoute un fichier idl où se trouve le CLID (uuid) de ton objet.

    Et d'autre petites choses que je ne pourrais pas expliquer, je n'ai pas fait de CORBA et très peu de COM.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Une DLL COM ne se fait pas à la légère: C'est tout un paradigme orienté objet qui entre en jeu...

    Pour ça, tu aurais plus vite fait d'écrire ta DLL en .Net et la régler en "COM-Visible"...

  6. #6
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut Il genere
    Salut
    Quand on crée des DLL avec un projet ATL COM, il généré des fichiers .c et des fichier .h , il faut ajouter ces fichier au projet avec des "include":
    Comme je me souviens pas tres bien des fichiers a inclure dans le projet
    primo, inclure tous les fichier
    secondo, exclure tout les fichiers qui ne sont pas utilisé
    Ses fichiers en question contiennent les GUID( Globally Unique IDentifier : c'est un identifiant unique :Adress physique en combinaison avec la date -> UNIQUE des COM DLL générés, et plein d'autre chose.
    Dès la génération du projet ATL COM le composant est enregistré dans la base de registre, si on CHANGE le repertoire de la DLL généré le composant n'est plus reconnue par le systeme.
    Donc il faut enregistrer le composant soit avec DllRegisterServer(), ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    "Windows R"
    cmd
    cd chemin/vers/repertoire DLL
    RegSvr32 laDll.dll
    Ce qui est pareil
    Images attachées Images attachées  

  7. #7
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Faut pas exagérer non plus....

    DllRegisterServer est LA fonction appelée par regsvr32.exe (et les installeurs)... Mais ca n'amenera rien de plus.

    regsvr32.exe va juste appeler deux points d'entrées de la DLL... qu'il suffit de déclarer comme tels !
    Nul besoin que la DLL soit un COM-Server !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    extern "C" {
    __declspec(dllexport) STDAPI DllRegisterServer(void)
    {
    ....
    }
    __declspec(dllexport) STDAPI DllUnregisterServer(void)
    {
    ....
    }
     
    }
    Apres... pour faire du COM il "suffit" de rajouter un DllGetClassObject() et un DllCanUnloadNow()

    Beaucoup de programmeurs pensent que COM est très compliqué, mais il suffit d'implémenter ces 4 fonctions de base, pour avoir un serveur COM parfaitement fonctionnel !

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    @nicroman: Tu oublies que faire ceci ne "trouvera" la DLL que si tu fais un CoCreateInstance() ou CoGetClassObject(), donc ce n'est pas ça qui permettra à la DLL d'être systématiquement trouvée au chargement du programme.

    Et ensuite, il faut que ce que retourne DllGetClassObject() respecte les règles COM.

  9. #9
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    medinoc, t'a raison il faut appeler CocreateInstance() pour créer une instance d'un objet com. car on peut pas instancier une classe purement abstraite ce qui est le principe de toute la technologie com. sans oublier CoInitialize.
    @nicroman: ensuite il faut créer des interfaces, appeler les interfaces, utiliser les fonction de cette interface etc.. c'est pas aussi simple.
    Concernant ton code. c'est tres compliqué
    De plus Regsvr32 ne sert pas qu'a enregistrer les objets COM, il existe aussi les Fichier .ocx a savoir les DLL ActiveX
    ps: Tout les programmes sont difficile a développer.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    De plus Regsvr32 ne sert pas qu'a enregistrer les objets COM, il existe aussi les Fichier .ocx a savoir les DLL ActiveX
    ps: Tout les programmes sont difficile a développer.
    Pour moi, ça rentre dans la catégorie "composants COM".

  11. #11
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Slt.
    Tout a fait d'accord. Disons qu'un contrôle active X est plutôt ostensible, et plus orienté contrôles comme le contrôle active X Windows Media Player, qu'on peut utiliser directement sur une page WORD par exemple, ou sur une boite de dialogue MFC. Il possède aussi une fenêtre de paramétrage

    En revanche d3d9.dll on ne fait que appeler une des ses interfaces internes IDirect3DDevice9 ensuite on appelle les fonctions de cette interface

    Cependant, nous pourrions utiliser des objets com pour afficher des fenêtres.

    Tout réside dans la manière avec laquelle le composant a été conçu(Dll,OCX), et dans quel but il sera utilisé.

Discussions similaires

  1. [C#] Définir un point d'entrée pour une dll en c#
    Par electro74 dans le forum Débuter
    Réponses: 1
    Dernier message: 26/01/2014, 21h44
  2. Définition du point d'entrée sur une DLL C++
    Par Fëanor 06 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 19/04/2010, 16h49
  3. [XL-2003] Erreur d'execution '453' Point d'entrée d'une DLL introuvable
    Par Mastein dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/08/2009, 17h12
  4. Point d'entrée d'une DLL et Variable globale
    Par David Fouejio dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/06/2007, 11h43
  5. Point d'entrée d'une fonction dans une DLL
    Par Muetdhiver dans le forum MFC
    Réponses: 5
    Dernier message: 16/02/2006, 00h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo