2010-11-17 3 views
2

Je dois implémenter un objet COM bare-bone en C++ (non ATL) utilisé par une application Web héritée pour vérifier que mon application existe. L'application Web fait quelque chose comme ça (JavaScript):Implémentation d'un objet COM bare-bones

var object = new ActiveXObject("My.Application");

Je veux faire en sorte que le réussit ci-dessus mais c'est tout ce que je dois faire - je ne ai pas besoin de mettre en œuvre des méthodes/propriétés sur cet objet comme ils ne sont jamais appelés. De toute évidence, je dois m'assurer que mon objet est enregistré en ajoutant les paramètres de registre nécessaires, etc Mon application est une DLL, donc je suppose que je dois également implémenter une poignée de fonctions exportées (DllRegisterServer, DllUnregisterServer, DllCanUnloadNow et, le celui qui doit donc quelque chose, DllGetClassObject).

Je suis assez sûr que simplement retourner S_OK de DllGetClassObject ne le coupera pas.

Comment puis-je implémenter une interface de base sans utiliser ATL? J'utilise le compilateur MS si cela aide.

+2

Pourquoi exactement ne voulez-vous pas ATL? – sharptooth

+0

C'est une dépendance qu'on m'a dit de ne pas utiliser. Hors de mes mains, j'ai peur. – Rob

+0

C'est réducteur. Vous pouvez lier statiquement à ATL de sorte que vous n'avez pas besoin de transporter ATL.dll autour - et personne ne le verra même ** et ** il vous fera économiser une tonne de temps et de bugs. Votre meilleur meilleur est de négocier l'utilisation d'ATL. – sharptooth

Répondre

3

Il n'est pas suffisant de créer un objet COM bare-bone. Pour commencer, ce serait tellement simple qu'il n'y a pas de nom associé. Vous avez déjà découvert que vous avez également besoin d'une fabrique d'objets. Donc, oui, mettre en œuvre DllGetClassObject. Vous devrez vérifier l'argument rclsid d'entrée. Ceci est un identifiant d'interface. Si vous ne le reconnaissez pas, renvoyez CLASS_E_CLASSNOTAVAILABLE. Apparemment, à cause des approches hackerish (comme le S_OK inconditionnel que vous avez suggéré) Microsoft now passes at least one invalid class ID.. Si vous mentez et que vous prétendez pouvoir le faire, Windows ne croira rien d'autre que vous dites.

Alors, quelles interfaces devriez-vous revendiquer? Évidemment IUnknown - c'est la racine même du système. L'objet COM le plus dénudé ne fait rien d'autre. Cependant, vous avez besoin de plus d'interfaces - l'application Web demande un objet ActiveX. Cela nécessite plus d'interfaces. L'approche la plus simple serait peut-être de voir ce que Windows demande. Je suppose que vous aurez besoin d'au moins IDispatch.

Ensuite, vous devrez implémenter quelques méthodes. "Attendez", vous pouvez dire, "ils ne sont pas appelés". Eh bien, IDispatch est une sorte de méta-interface pour les langages de script. Il est utilisé pour énumérer les méthodes disponibles. Par conséquent, votre interfaceIDispatch devrait également prendre en charge une telle énumération, même si elle renvoie des méthodes scriptables nulles.

Il y a beaucoup plus de détails, mais cela devrait déjà suffire à vous convaincre d'utiliser ATL et de récupérer son code ActiveX. Ça va être beaucoup plus complet que tout ce que je peux énumérer ici.

+0

Merci pour votre aide. J'ai implémenté un objet simple et une usine et cela fonctionne parfaitement. – Rob

1

Il n'y a rien à propos d'un serveur COM qui prend en charge la liaison tardive de Javascript dans IE. Si vous ne savez pas comment implémenter DllGetClassObject() alors vous avez besoin de toute l'aide que vous pouvez obtenir. Vous obtenez beaucoup d'aide d'ATL et des assistants intégrés dans Visual Studio. La grande majorité du code de plomberie fugace est générée automatiquement, y compris ces 4 exportations. Et IDispatch, l'interface dont le Javascript a besoin.

Démarrez le projet avec le modèle de projet ATL + ATL. Les défauts sont bons. Cliquez avec le bouton droit sur le projet, Ajouter, Classe et sélectionnez Objet simple ATL + ATL. Passez en mode Class, localisez le type d'interface et cliquez dessus avec le bouton droit de la souris pour ajouter des méthodes et des propriétés.