COMプログラミングは生きており、Windowsプラットフォーム上では健在だ、C++の新しい変形版は、COMプログラミングをもっと扱い易くしている。 C++ Component Extensions(C++コンポーネント拡張)として知られている、この新言語は、新しいWindowsランタイム、WinRTを作るために使われた。
COMをベースにしているが、C++ Component Extensions は、何よりも .NETプログラミングに一番似ている。これを使うと、COMインターフェースを通さずに直接クラスやオブジェクトを扱うことになる。
C++コンポーネントは、“public ref class XXX sealed” ここでXXXはクラス名、というシグネチャを使って宣言する公開クラスで始まる。このように修飾されたクラスは、「活性化可能クラス」として知られており、.NET や JavaScriptベースのアプリケーションが消費できる。“ref” キーワードは、そのクラスが「Windows Runtime 互換の型」であることを示している。“sealed” キーワードは継承を抑止している。クラスがJavaScriptによって消費できるようにするためである。文書がこの点に関して曖昧であるが、JavaScriptから使われないクラスなら sealedである必要はない様だ。例えば、 Button クラス は ButtonBaseから継承している。クラスに加えて、 C++コンポーネント拡張は構造体もサポートする。しかし Windows Runtime構造体 は、むき出しのデータメンバーのみに限られる。
クラスは、コンストラクタ、メソッド、プロパティ、イベントを持つことができる。クラス自身の外で、イベントによって使われるデリゲート シグネチャを見ることもある。これはC++/CLI ではないが、シンタックスは、ハンドルのための^シンボルを使い、非常に良く似ている。
C++コンポーネント拡張におけるメモリーは、それを消費する言語のセマンティックスによって、異なって処理される。もしC++アプリケーションがライブラリを使えば、その時オブジェクトは参照カウントされる。.NETコンシューマは、もちろんマーク&スイープ方式のガーベッジコレクション使う。
公開メソッドは 全ABI すなわち Abstract Binary Interfaceから見える。そのようなメソッドは、パラメータに Windows Runtime型を使わなければならない。intやdoubleのようなC++の組込み型は、自動的に変換される。他の型は明示的に宣言しなければならない。公開メソッドには、 Platform::Stringが使われる。内部で、Microsoftは標準のC++ string 型を使うことを薦めている。
全ABIで、カスタム例外型はサポートされない。開発者は組込みの例外型の一つをスローしなければならない。もし追加の情報が必要な時は、 HRESULTをパラメータとして取る一般的な COMExceptionを投げることができる。
JavaScriptのサポートするクラスは sealedだが、少なくともインターフェースを実装できる。