Meilleur endroit pour apprendre le modèle d'objet de composant [fermé]

13

J'ai besoin d'apprendre COM pour mon projet actuel. Je suis un noob et je n'ai pas pu trouver de bons points de départ pour COM. J'ai cherché dans MSDN et googlé ... J'ai trouvé des articles intéressants sur codeproject.com, mais je ne suis pas satisfait. Pourquoi utilisons-nous COM? Pourquoi existe-t-il? À quels endroits existe-t-il? ..... et ainsi de suite .. Alors, pouvez-vous me dire où puis-je trouver des réponses à ces questions?

Chani
la source
3
Pourquoi utilisons-nous COM? Surtout, nous essayons de ne pas le faire. À quels endroits existe-t-il? Bases de code héritées douloureuses, généralement.
Carson63000
@carson actully je développe un logiciel de surveillance où j'ai besoin de récupérer les valeurs des objets "COM". D'où la nouvelle quête trouvée ..
Chani
1
Si je me souviens bien, sur les 3 meilleurs articles sur COM, 2 étaient sur MSDN (un ancien article de magazine) et 1 sur CodeProject ... il y en a évidemment des centaines d'autres quelque peu utiles, donc c'est comme trouver une aiguille dans une botte de foin. (et merci à Google de ne renvoyer que les sites du TLD ".com" lorsque je recherche "COM" ...)
rwong
@ Carson63000 Tellement vrai que ça fait mal ... d'aller pleurer dans un coin maintenant.
Evicatos

Réponses:

18
  • Tout d'abord, COM est comme la programmation orientée objet. L'interface COM est une interface abstraite.
  • COM a un avantage sur la propre POO intégrée de chaque langue en ce que vous pouvez avoir des classes COM implémentées dans différents langages et / ou compilées par différentes versions de compilateurs, et elles pourront toujours interagir. Ceci est appelé "interface binaire d'application" (ABI)
  • COM utilise le comptage de références. Cela peut être ennuyeux au début, mais dès que vous en apprendrez sur les pointeurs intelligents, votre vie sera beaucoup plus facile et vous constaterez que le concept de comptage de références est très facile à comprendre.
  • COM utilise une façon étrange de cast de classe, à savoir "Query Interface".

Apprendre l' IUnknown est la première étape.

Une bonne interface COM qui convient à l'étude du débutant est l'interface IStream. Vous pouvez pratiquer COM en implémentant l'interface IStream à l'aide de nombreux types de stockage des données.


Ajouté le 28/09/2012:

Après que le mécanisme COM a été inventé, les gens de Microsoft ont découvert que ces mécanismes ouvrent la porte à des astuces de programmation inhabituelles qui ne sont pas des POO orthodoxes. Au niveau le plus bas, IUnknown.QueryInterfacec'est juste une méthode; il peut tout faire. Ces astuces rendent la COM intimidante pour les apprenants, car elles peuvent invalider le raisonnement de base qui peut être emprunté à la POO.

La documentation Microsoft sur MSDN passe beaucoup de temps à dire "COM n'est pas ..." ou "Ne faites aucune supposition" expliquant comment ces astuces inhabituelles peuvent casser votre code.

Les concepteurs COM utilisent le principe de substitution Liskov (le «L» dans SOLID ) pour s'assurer que leurs multiples interfaces et l'utilisation de trucs n'invalident pas le raisonnement de base de la POO ou le fonctionnement du programme.

Si votre projet n'utilise pas ces astuces, il est normal de voir COM uniquement du point de vue POO. Si votre projet utilise ces astuces, vous devrez voir COM comme du code à modification automatique.

(Blague: Nous avons dû passer tellement de temps avec L que nous ignorons généralement les quatre autres principes.)

rwong
la source
9

La raison principale de COM est de fournir une interface de communication orientée objet entre une application et d'autres applications et DLL qui peuvent vivre dans différents espaces mémoire, et entre des objets qui peuvent avoir différentes représentations d'objets internes.

Quelque chose à retenir lors de l'apprentissage de COM est qu'à l'époque C ++ était roi et que les applications appelées dll utilisaient C. Il n'y avait pas d'ABI commun (comme le dit @rwong) et COM était la solution Microsoft.

Cela vaut probablement la peine de jeter un œil à la bibliothèque de modèles actifs (ATL) pour Visual Studio, ce qui facilite également l'utilisation de COM.

Quelques livres que j'ai trouvés utiles à l'époque

http://www.amazon.com/Essential-COM-Don-Box/dp/0201634465/ref=sr_1_1?ie=UTF8&qid=1304946825&sr=8-1

http://www.amazon.com/Understanding-ActiveX-OLE-Developers-Technology/dp/1572312165/ref=pd_sim_b_4

hth

daven11
la source
7

J'ai d'abord appris COM sur le livre Learning DCOM (DCOM est juste une extension de COM, le livre est principalement sur COM). Il a plus de dix ans et devrait être bon marché si vous l'utilisez (car COM n'est plus vraiment chaud, même pas dans le monde Microsoft, même s'il est toujours utilisé pour l'interopérabilité).

La raison principale de l'existence de COM est de faciliter le développement basé sur les composants, ce qui signifie essentiellement qu'au lieu de lier des bibliothèques lorsque vous compilez votre code, vous référencez une interface (la description de la façon de communiquer avec un composant externe) et utilisez une implémentation de que lorsque vous déployez. Il est à la base de la plupart des technologies de Microsoft.

Le système prend en charge certaines fonctionnalités intéressantes avant que tout ne soit géré (comme le comptage des références et l'auto-description (via IDispatch)).

Deckard
la source
5

COM est une norme créée dans les années 90 pour permettre à différents logiciels de communiquer entre eux. Le plus important est le standard binaire qui permet à un logiciel de créer ou de se lier à un objet, puis d'appeler dans cette interface. Cela vous permet de faire des choses comme créer une DLL en C ++ qui peut être appelée par une page ASP (objets COM), ou créer un contrôle dans Delphi que vous pouvez placer dans une boîte de dialogue VB (contrôles ActiveX) ou une feuille de calcul Excel. Lorsque vous collez une image dans Word, elle utilise également COM, incorporant une application distincte dans Word. Le DCOM qui appelle les objets distants est moins populaire, il existe généralement des moyens plus simples de le faire.

Com / ActiveX / DCOM était donc très populaire il y a 10 ans avec VB, VBA, C ++ / ATL, Delphi. Dotnet est cependant beaucoup plus simple et C # a remplacé la plupart des utilisations de COM et VB, etc.

Il existe encore de nombreuses interfaces COM que vous pouvez appeler à partir d'une application dotnet, Java ou C ++. (Tu ne dis pas)

Si vous devez appeler des interfaces COM, VB est le moyen le plus simple de le faire. Dans Dotnet 4.0 C # a le mot-clé dynamique qui facilite l'appel des interfaces IDispatch, ce qui est probablement une excellente solution que vous devriez examiner.

Si vous avez besoin de connaître beaucoup de détails, vous devez vraiment utiliser C ++ et ATL, appelez les API C comme CoCreateInstance. Évitez cela si vous le pouvez, car c'est une ancienne technologie et n'est pas très utile, respectez les recommandations ci-dessus.

Je ne sais pas quel logiciel de surveillance vous regardez, mais il est probable qu'il soit disponible via les classes System.Management dans dotnet.

Richard
la source
2

Les informations suivantes pourraient être utiles: aperçu COM:

La première vidéo parle de l'idée générale de créer des composants binaires pour réutiliser des codes écrits dans différents langages (indépendants du langage) et se trouvant dans différentes machines (processus) (indépendants de l'emplacement / transparents). Cette technologie est utilisée dans certaines sociétés de logiciels pour s'intégrer à d'autres logiciels (sociétés) au lieu d'acheter leurs logiciels et de les intégrer dans les leurs ou d'écrire les codes à partir de zéro dans leurs systèmes.

Cette technologie a trois versions différentes (implémentations):

OLE / COM / DCOM / ActiveX pour les développeurs C ++ (ATL est utilisé pour faciliter le travail du programmeur)

JavaBeans / RMI / EJB pour les développeurs Java

CORBA / IIOP

Pensez-y simplement comme une technologie qui est pratique lorsque vous avez votre logiciel écrit en Java et que vous souhaitez y ajouter une fonctionnalité qui existe déjà dans un package mais elle est écrite en C ++ et peut-être même se trouve sur une machine différente pas dans votre machine locale. Comment appelez-vous "nouveau", comment créez-vous des objets et des méthodes à partir d'eux?

Les livres suivants que j'ai vus des gens qui font du codage COM ont l'un ou l'autre dans leurs étagères:

  • Atelier des développeurs sur COM et ATL 3.0

  • Inside Com

  • COM essentiel

Mahshid Zeinaly
la source