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é).
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 :'(
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)
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
- Compiler en Release x64
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5Cpp dernierResultat = a + b; *result = dernierResultat; CptCall++; return S_OK;
- 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) ?
Merci d'avance pour vos réponsesJ'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é
(edit) PS :
Effectivement il manque des infos dans la base de registre, si j'ajoute ces lignes cela fonctionne :
Problème, j'ai ajouté ces lignes "manuellement" il faudrait qu'elles soient générées au moment de l'appel à regsvr32
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}"
Partager