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

Bibliothèques Discussion :

Objet COM (Visual Studio 2022 projet ATL)


Sujet :

Bibliothèques

  1. #1
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut Objet COM (Visual Studio 2022 projet ATL)
    Bonjour ,
    J'espère être dans la bonne partie du forum.

    Je tente de créer pour la première fois un objet COM en C++ (oui, ce n'est pas une nouvelle techno ^^, mais un vrai besoin en interne fait que je dois en passer par là).

    En bref :
    J'arrive à utiliser mon objet COM en VBA à condition de l'ajouter dans les références et de le créer explicitement, mais CreateObject ne fonctionne pas.
    Ça pourrait ne pas sembler très grave, mais j'ai un vrai besoin que cela fonctionne (expliquer pourquoi serait trop long, déjà que ce message me semble pas mal détaillé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vba
        Dim TestDoc As ATLPourDocumentationLib.DocMath
        Set TestDoc = New ATLPourDocumentationLib.DocMath
        Debug.Print TestDoc.Somme(12.12, 13) 'OK
     
        Dim TestDoc2 As Object
        Set TestDoc2 = CreateObject("ATLPourDocumentationLib.DocMath") 'Erreur 429
        Debug.Print TestDoc2.Somme(55, 11)
    Je pense avoir raté une étape dans la définition des données à enregistrer en base de registre, mais je n'arrive pas à trouver laquelle :'(

    Merci pour vos réponses si vous stoppez votre lecture ici ^^.

    En détail :
    J'ai donc créé un projet ATL sous Visual Studio 2022 et j'écris une documentation en même temps pour capitaliser ces connaissances (malheureusement étant donné que je le fais sur mon temps de travail je ne pourrais pas partager cette documentation une fois terminée, je m'en excuse pour ceux que cela aurait pu intéresser).

    Pour résumer tout de même les étapes que j'ai suivies :
    Sous Visual Studio 2022 (les autres versions auront sans doute ~ la même chose)

    - Créer un nouveau projet
    - Choisir : C++ / Windows et saisir "ATL" au niveau de la recherche de modèle de projet, choisir "Object simple ATL" (ou "ATL Simple Object")
    - Nommer sa solution
    - Ne rien toucher aux paramètres ATL (si ça se trouve c'est ici que j'aurais dû ajouter un truc)

    La solution est générée avec deux projets : le "classique" et un second suffixé de "PS" qui dans mon cas est à priori inutile, je l'ai donc supprimé (c'est pour le support de support proxy/stub, des mécanismes utilisés pour permettre la communication entre des objets situés dans différents appartements d'un processus, ou même entre différents processus, tout du moins si mes informations sont correctes). <-- si c'est ça mon erreur je vais me sentir vraiment mal xD

    J'ai ajouté une classe "DocMath" ("Ajouter" > "Nouvel élément" > "Visual C++" > "ATL" > "ATL Simple Object").
    --> Edit : Le problème était ici, il ne faut surtout pas oublier de renseigner le ProgId, sinon CreateObject ne fonctionnera pas

    Avec l'assistant de classe, j'ai ajouté une méthode Somme (qui prend deux doubles et retourne un double) et une propriété DernierResultat (retournant un double étant le dernier résultat d'une addition faite avec Somme) :
    Dans l'"Affichage de classes" : clique droit sur mon interface, "Ajouter" > "Ajouter une méthode"

    - Nommé la méthode (dans mon cas `Somme`)
    - Ajouter deux paramètres double (a et b) et un double* (result)
    - Renommer le 3eme [out], en [out, retval]

    J'ai ensuite créé le code dans la classe DocMath

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Cpp
        dernierResultat = a + b;
        *result = dernierResultat;
        CptCall++;
        return S_OK;
    - Compiler en Release x64
    - Enregistrer ma DLL avec regsvr32 dans une invite de commande en mode Administrateur

    Pour finir, je teste mon objet en VBA et là j'ai la mauvaise surprise de voir que `CreateObject` ne fonctionne pas (voir "En bref :").

    Je pense qu'il manque quelque chose dans mon enregistrement en base de registre pour que cela fonctionne (je ne trouve pas de clé Ordinateur\HKEY_CLASSES_ROOT\ATLPourDocumentationLib.DocMath et si les informations que j'ai pu glaner sont correctes c'est ça qui fera fonctionner CreateObject).

    Comment puis-je faire en sorte que cette info soit ajoutée (si possible en passant par un assistant car l'idée étant que cette mécanique soit réutilisable au maximum et par des personnes peu expérimentées) ?

    J'ai ajouté un lien de téléchargement de mon projet histoire que vous puissiez voir ce que j'ai fait et ce qu'il pourrait manquer (dans Drive car trop gros pour Developpez.com) :
    Lien supprimé
    Merci d'avance pour vos réponses

    (edit) PS :
    Effectivement il manque des infos dans la base de registre, si j'ajoute ces lignes cela fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    reg
     
    [HKEY_CLASSES_ROOT\ATLPourDocumentationLib.DocMath]
    @="Test création  la main"
     
    [HKEY_CLASSES_ROOT\ATLPourDocumentationLib.DocMath\Clsid]
    @="{e2912e6f-a6c8-4444-91c3-d55c2f9dcbdd}"
    Problème, j'ai ajouté ces lignes "manuellement" il faudrait qu'elles soient générées au moment de l'appel à regsvr32

  2. #2
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 35
    Par défaut J'ai trouvé !
    Bonjour,

    J'ai trouvé mon problème !
    En fait c'était simplement que durant le process de création de ma classe j'avais oublié de renseigné une cellule (que de temps perdu pour une connerie ).

    A cette étape :
    --> J'ai ajouté une classe "DocMath" ("Ajouter" > "Nouvel élément" > "Visual C++" > "ATL" > "ATL Simple Object"). <--

    Il faut ajouter dans la cellule `ProgId` le nom de la classe que l'on souhaite utiliser avec CreateObject.

    Voila tout, problème résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Visual studio 2010 projets
    Par Invité dans le forum Visual Studio
    Réponses: 6
    Dernier message: 31/12/2010, 15h42
  2. Template Visual Studio Multi-Projets
    Par Tekarihoken dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 23/03/2010, 22h20
  3. Réponses: 4
    Dernier message: 17/04/2009, 23h25
  4. opacity sur un objet panel visual studio
    Par zerros dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/03/2009, 22h36
  5. Réponses: 4
    Dernier message: 31/05/2006, 14h44

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