Les différences entre C++/CLI et C++/CX

 

WinRT et COM

Windows 8 possède une nouvelle interface Metro, qui s’appuie sur l’API WinRT.

Pour créer une application Metro pour Windows 8, il faut attaquer l’API WinRT. Cette dernière est écrite en code natif, et disponible sous la forme d’objets COM améliorés. L’avantage, c’est que c’est une interface objet. L’inconvénient, c’est que ce sont des objets qui ressemblent beaucoup à COM.

Ceux qui ont déjà utilisé des objets COM en C++ connaissent leur malheur. Ce n’est vraiment pas agréable d’utiliser COM en C++, même si l’utilisation du framework ATL simplifie les choses.

En fait, la différence entre COM d’il y a 20 ans et COM utilisé par WinRT est que l’interface de base n’est plus IUnknown, mais IInspectable. IInspectable contient IUnknown plus une sorte de IDispatch.

Comme WinRT est disponible sous forme d’objets COM, on utilisera l’API WinRT de la même manière qu’on utilise un objet COM. Pour l’API WinRT, Microsoft a créé un successeur à ATL qui s’appelle WRL, Windows Runtime Library. La documentation de ce framework WRL est disponible sur MSDN.

Oui, utiliser ATL n’était pas une sinécure, et ce n’est pas mieux avec WRL.

WinRT et C++/CX

Pour nous éviter WRL, qui n’est pas toujours facile ni agréable à utiliser, Microsoft a donc inventé un nouveau langage : C++/CX. Ou plutôt, a ajouté des extensions au langage C++. Ces extensions vont permettre d’utiliser les objets COM/WinRT nativement dans le langage. Pas besoin d’utiliser WRL, donc.

C++/CLI est destiné à permettre l’utilisation d’objets .Net en C++. C++/CX permet d’utiliser les objets WinRT en C++. Ces deux langages sont très similaires. La principale différence est le type d’objet externe qu’ils référencent : des objets .Net pour C++/CLI, des objets COM/WinRT pour C++/CX.

Pour référencer ces objets “externes”, C++/CX possède la notion de pointeur “chapeau”, comme C++/CLI, et utilise ref new au lieu de gcnew :

Pointeur vers un objet C++ :

CPPClass *pObj = new CPPClass();
pObj->MethodeCPP();

Référence vers un objet .Net en C++/CLI :

NetClass ^refObj = gcnew NetClass();
refObj->MethodeDotNet();

Référence vers un objet natif COM/WinRT en C++/CX :

WRTClass ^refObj = ref new WRTClass();
refObj->MethodeCOM();

Un pointeur ^ (hat pointer, ou pointeur chapeau) vers un objet WinRT est un pointeur intelligent ou “smart pointer”, capable de compter les références vers l’objet, et de le libérer automatiquement. Plus besoin de delete ! C’est l’exact équivalent de CComPtr de la librairie ATL.

C++/CX permet d’utiliser des objets COM de manière très simplifiée, grâce à ce pointeur chapeau. Tout le code nécessaire à l’instanciation et l’utilisation des objets COM est caché.

C++/CX ressemble beaucoup à C++/CLI, car ces deux langages répondent à la même problématique : comment utiliser dans un langage qui ressemble à C++ des objets qui ne sont pas des objets C++.

Les différences

Voici un tableau listant les différences entre C++/CLI et C++/CX. Les principales différences sont que C++/CX ne génère que du code natif, et référence des objets COM, alors que C++/CLI génère parfois du code MSIL et référence des objets .Net. Mais d’autres différences plus subtiles existent.

C++/CLI C++/CX
Option de compilation C++ pour activer les extensions /CLR /ZW
Type d’objet référencé par les pointeurs chapeau Objet .Net managed Objet COM implémentant l’interface IInspectable
Création d’un objet gcnew TYPE ref new TYPE
Libération des références d’objets alloués Garbage collector ou ramasse miettes. Gérée automatiquement par comptage des références et pointeurs intelligents
Code généré Code natif + code MSIL géré Code natif seulement, génération automatique d’interfaces COM.
Multi-plateforme (x86, x64, ARM) Oui, recompilation nécessaire Oui, recompilation nécessaire
interior_ptr, pin_ptr Oui Non supporté
Création d’objets sur la pile Non Oui
Référence vers un pointeur ^ ^% ^&
Singleton (pointeur ^ global) Non Oui
Constructeur statique Oui Non
Classe C++ incluse dans ref class Non Oui
ref class incluse dans classe C++ Non Oui

 

Est-ce que c’est clair ?

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>