属性の目的
属性は、従来の C++ では言語構成要素を壊さない限り不可能であった機能拡張を実現します。属性を使用することで、プロバイダ (独立した DLL) は、言語の機能を動的に拡張できます。属性の最大の目標は、コンポーネント開発の生産性を高めると共に、COM コンポーネントのオーサリングを簡単にすることです。属性は、クラス、データ メンバ、メンバ関数など、C++ のほとんどすべての構成体に適用できます。この新しいテクノロジの主な利点は次のとおりです。
使い慣れた簡単な呼び出し規約を公開します。
挿入されたコードを使用できます。このコードは、マクロとは異なり、デバッガで認識されます。
面倒な実装の細部に踏み込むことなく、基本クラスから簡単に派生できます。
COM コンポーネントに必要な大量の IDL コードを、少数の簡潔な属性に置き換えます。
たとえば、ジェネリックな ATL クラスに対する簡単なイベント シンクを実装するには、CMyReceiver などの特定のクラスに event_receiver 属性を適用します。Visual C++ コンパイラは、event_receiver 属性をコンパイルし、適切なコードをオブジェクト ファイルに挿入します。
[event_receiver(com)]
class CMyReceiver
{
void handler1(int i) { ... }
void handler2(int i, float j) { ... }
}
その後、イベント ソースからのイベントを処理するように (組み込み関数の __hook を使用して)、CMyReceiver の handler1 メソッドと handler2 メソッドをセットアップできます。イベント ソースは、event_source を使って作成できます。