この質問は WinRT に関するものであると仮定します。それ以外の場合は、あいまいすぎて答えることができません。
一番下の図は非常に誤解を招くものです。プログラマーとして知っておくべきことの視点を示しています。また、WinRT アプリを作成する場合、古い winapi を直接扱うことはありません。これはWinRT APIに置き換えられ、オペレーティング システム サービスを取得するためにのみ使用することになっています。
実装は大きく異なります。CLR は、デスクトップ アプリの場合と同様に、winapi の上で実行されます。また、アンマネージ コードと相互運用できます。Windows は基本的にアンマネージ オペレーティング システムです。WinRT の場合も同様で、COM ベースのアンマネージ API です。
すべての WinRT アプリは、実際にはアウトプロセス COM サーバーであり、30 年前にこのようなサーバーが使用されていたようです。特別なモードで実行されます。Microsoft は、UAC を機能させる配管に追加のレイヤーを追加しました。これは「アプリ コンテナ」と呼ばれ、サンドボックスのように機能します。ユーザーが UAC プロンプトによって昇格されなかった場合、UAC がプログラムが特定のディレクトリまたはレジストリ キーにアクセスするのを防ぐのと同じように、アプリ コンテナーはプログラムが面倒な winapi 関数を使用するのを防ぎます。使いやすさやセキュリティの問題を引き起こしたり、バッテリーの消耗が速すぎる種類。WinRT には、そのような winapi 関数の代替品があります。
COM は少し悪名高く、Microsoft が使用するユニバーサルな相互運用ソリューションですが、プログラミングは特に簡単ではありません。Microsoft は、COM をより使いやすくするために多くの作業を行いましたが、ほとんどの場合、COM を完全に非表示にしました。注目すべきは、タイプ ライブラリが .winmd ファイルに置き換えられたことです。これは、より多くの詳細を表現できる大幅に拡張されたバージョンです。彼らは、.NET メタデータのデータ形式を使用しました。
そして、彼らが COM を隠した極めて重要な方法は、さまざまなランタイム サポート ライブラリに組み込まれた言語プロジェクションです。C++ の場合、C++/CX 言語拡張機能とランタイム ライブラリに隠されています。Javascript の場合、Chakra 実行エンジン内に隠されています。また、マネージ コードの場合、参照アセンブリの [TypeForwardedTo] を使用して .NET フレームワーク内に隠されます。言語プロジェクションは、WinRT の型と動作から言語固有の型に変換されます。COMエラーコードが例外に変換されるなどの基本的なもの。また、WinRT HSTRING 型は System.String に変換されます。など。
言語の投影が亀裂から覗く場所がいくつかあり、奇妙に見える制限に表示されます。WinRT コンポーネントは常にシール クラスでなければならないのと同様に、実装の継承をサポートしない COM の副作用です。または、コンポーネントで DateTimeOffset を公開できますが、DateTime は公開できません。また、一部の WinRT 型は .NET 型に適切にマップされず、IBuffer は悪名高いです。