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:
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:
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) ?
Citation:
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:
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