Question

Je prévois faire ma demande existante en serveur RTD .

L'application est actuellement écrit en C ++ et pendant que je vais finir par le port à C # / Mono Je veux être en mesure d'ajouter la fonctionnalité RTD avec C ++.

J'ai trouvé quelques morceaux d'échantillons de code (le MSVCRTDServer) et ce site: http://weblogs.asp.net/kennykerr/archive/2008/10/29/excel-rtd-server-in-c.aspx

Malheureusement, ce sont DLLs et je l'ai oublié tout ce que je connaissais COM (bon débarras) il y a longtemps.

Comment puis-je faire pour intégrer les exemples de DLL dans le EXE? Ceci est apparemment sur le conditionnement du serveur COM dans un fichier EXE plutôt que d'une DLL.

EDIT:

Remarque, l'application existante a une interface graphique MFC.

EDIT:

L'utilisation prévue est taht l'application GUI existante sera en cours d'exécution - pas besoin pour les clients de l'interface COM / RTD pour lancer l'application. (Bien que je ne nie pas ce serait bien)

Fondamentalement, je veux implémenter l'interface IRTDServer avec mes propres données - de sorte que Excel (ou d'autres applications) peuvent accéder aux données dynamiques que l'application fournit. (Il est un programme qui parle à un dispositif de port série - cet appareil a un statut / état que les changements et je veux être en mesure de mettre à jour les clients sur les changements de manière asynchrone)

Alors, je dois créer un objet COM et l'enregistrer afin que les clients peuvent « voir ».

Je ne sais pas comment ajouter un objet COM à un exe et avoir cet objet COM implémenter une interface existante / pré-definfed.

EDIT J'ai commencé une prime sur ce que je puisse obtenir des échantillons de code. Apparemment, je suis trop paresseux et stupide (ou peut-être il est juste l'aversion hyper COM) pour commencer avec existante réponse par Franci Penov. (Ce qui est très utile et un bon début)

Donc, fondamentalement, ce que je cherche est:

code pour prendre mon application MFC à base de dialogue existant qui a un tas de fils en cours d'exécution et le transformer en un serveur RTD (qui a la même interface utilisateur)

Tout ce qui CoCreate et CoThisandthat, etc. Où dois-je mettre ce code dans mon exe? Comment puis-je étendre / mettre en œuvre les trucs de IRTD?

A avant et après d'un échantillon MFC bonjour app monde (base de dialogue) va obtenir la réponse acceptée.

  1. Avant l'application avec tout le code source pour l'application de dialogue mfc.
  2. « après » l'application qui est basée sur l'application MFC à l'étape 1 qui implémente l'interface srver RTD et tous sa source. (Tous les fichiers du projet, la source, etc.)
  3. les mesures prises dans l'interface graphique / visual studio et sinon pour créer l'étape 2 de l'étape 1. (IDL, etc. D'autres fichiers créés.)

L'idéal est prévu pour VS2008, mais une version fonctionnerait.

Merci.

Était-ce utile?

La solution

EDIT: Mec, je ne l'ai pas touché depuis l'an MFC 2000. J'espérais le rester pour le reste de ma vie. :-) En tout cas ...

Aparently, les sorciers ont évolué depuis le dernier siècle. Les étapes suivantes pour ajouter ATL support COM et application MFC sont pour VS 2008.

  1. Générer simple dialogue MFC application basée appelé MFCTest. Ne pas cochez la case Automation dans l'Assistant.
  2. Faites un clic droit sur le projet et sélectionnez Ajouter / classe ... Dans la boîte de dialogue, choisissez objet ATL simple. Vous obtiendrez un avertissement que le soutien ATL sera ajouté au projet.
  3. Un nouvel assistant ouvrira ses portes avec des options pour le nouvel objet ATL.

Vous devriez faire.

Franchement, je ne vois aucune raison de poster ici un code généré par l'Assistant. Mais si vous avez d'autres questions sur des éléments particuliers de ce code, les poster sur le SO et je vais vous aider.


EDIT: Ce tourne lentement dans un article. Si nous continuons comme ça, je pourrais même publier un livre. : -)

Une fois que vous avez l'objet simple ATL intégré dans le projet MFC, vous pouvez ajouter l'interface RTD à elle. Vous aurez besoin à la fois hériter de l'interface et l'ajouter à la COM_INTERFACE_MAP. Depuis l'interface RTD est une interface IDispatch, vous devez hériter votre classe de IDispatchImpl <> et d'ajouter IDispatch à l'aide COM_INTERFACE_MAP COM_INTERFACE_ENTRY2 (afin de préciser qu'il est mis en œuvre par le IRtdServer.

Je ne suis pas vraiment au courant de la façon dont fonctionne la RDT. Vous pouvez également ajouter le support pour les points de connexion COM à votre classe, si Excel doit supscribe à vos mises à jour. Voici également un lien pour vous rafraîchir points de connexion dans ATL connaissance.

BTW, je suis tombé sur ce billet de blog qui a le C ++ définitions des deux interfaces RTD . Vous avez probablement déjà, mais je pensais que je rajouterais pour être complet.


La façon la plus simple serait de créer un nouveau projet EXE ATL via l'assistant VS et laissez-le prendre de l'enregistrement et la partie de la gestion des processus. Le reste est pas si différent.

Si vous avez besoin d'un échantillon particulier pour démarrer votre voyage de retour au pays de COM out-of-proc, vous pouvez regarder LABRADOR .

Couple de liens qui pourraient être plus intéressantes pour vous:

EDIT: Si vous avez juste besoin de savoir comment enregistrer un objet dans votre EXE avec COM, donc des applications clientes peuvent CoCreateInstance il, consultez CoRegisterClassObject . Cependant:

  • l'objet doit être un objet COM
  • vous avez besoin de mettre en œuvre une usine de classe pour elle
  • si vous voulez la gestion des processus (c.-à-COM démarre votre application à la demande), le ClassID Nees être enregistré dans le registre
  • si le client va créer par ProgID, la nécessité ProgIDs à enregistrer dans le Registre
  • vous pourriez avoir besoin d'un dll proxy personnalisé / stub, si vous faites sur commande de triage
  • si votre application a l'interface utilisateur, vous devrez modifier la logique d'arrêt, de sorte que lorsque l'utilisateur ferme l'interface utilisateur, l'application ne untili quitte pas la dernière référence COM à vos objets a été libéré et

EDIT 2: Je suggère toujours vous regardez l'ATL exemple hors proc et au squelette de l'assistant d'ATL généreriez pour comprendre la séquence des opérations. Cependant, vous pourriez avoir besoin de se plonger un peu dans le code ATL pour voir ce qui se passe exactement.

Voici la version courte du processus:

Sur une start-up, les Nees d'application pour vérifier un argument de ligne de commande particulière - / intégré . Si cet argument est présent, cela signifie que l'application est lancée par la Commission en réponse à un appel CoCO. L'application peut choisir de ne pas afficher son interface utilisateur à ce stade.

Que l'application montre l'interface utilisateur ou non, il doit enregistrer les usines de classe pour tous les objets COM fournit via l'API CoRegisterClassObject je l'ai mentionné ci-dessus.

Si l'application est lancée par COM, il peut choisir d'arrêt lui-même sur la dernière version de référence COM. (Ceci est habituellement détecté par un compteur global supplémentaire ref qui est augmentée sur tout AddRef objet et a diminué sur un objet Release). Cependant, l'application ne devrait pas l'arrêt lui-même, si elle détecte que l'utilisateur interagit avec son interface utilisateur. dans ce cas, l'arrêt est différé jusqu'à ce que l'utilisateur ferme explicitement la dernière interface utilisateur (Pour que la détection plus facile, l'application ne montre pas habituellement son interface utilisateur jusqu'à ce que l'utilisateur tente de démarrer explicitement)

Si l'application a été lancée par l'utilisateur et l'interface utilisateur las est fermé, l'application doit vérifier s'il y a des références COM exceptionnelles à tout objet en elle. S'il n'y en a pas, il peut arrêter lui-même. Si toutefois, il y a des références COM, l'application doit cacher l'interface utilisateur, mais continuer à fonctionner jusqu'à ce que la dernière référence est libérée.

Si l'application a atteint un point où il l'arrêt, il devrait retirer tous les enregistrements d'usine de classe.

Autres conseils

Vous, maréchal votre code dans un projet ATL Server. Voir échantillons échantillons ATL Server .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top