COM および .NET 用の C++ の属性C++ Attributes for COM and .NET

Microsoft では、COM C++プログラミングを簡略化し、共通言語ランタイム開発を .NET Framework する属性のセットを定義しています。Microsoft defines a set of C++ attributes that simplify COM programming and .NET Framework common language runtime development. ソースファイルに属性を含めると、コンパイラはプロバイダー Dll と連携して、生成されたオブジェクトファイルのコードを挿入したりコードを変更したりします。When you include attributes in your source files, the compiler works with provider DLLs to insert code or modify the code in the generated object files. これらの属性は、.idl ファイル、インターフェイス、タイプライブラリ、およびその他の COM 要素の作成に役立ちます。These attributes aid in the creation of .idl files, interfaces, type libraries, and other COM elements. 統合開発環境 (IDE: integrated development environment) では、属性はウィザードとプロパティウィンドウによってサポートされています。In the integrated development environment (IDE), attributes are supported by the wizards and by the Properties window.

属性では、COM オブジェクトを記述するために必要な詳細なコーディングの一部が不要ですが、使用するにはcom の基礎の背景が必要です。While attributes eliminate some of the detailed coding needed to write COM objects, you need a background in COM fundamentals to best use them.

注意

C++ 標準属性を探している場合は、「属性」を参照してください。If you are looking for C++ standard attributes, see Attributes.

属性の目的Purpose of Attributes

属性はC++ 、現在のところ、言語の従来の構造を壊すことなく、方向に拡張できます。Attributes extend C++ in directions not currently possible without breaking the classic structure of the language. 属性を使用すると、プロバイダー (個別の Dll) は言語機能を動的に拡張できます。Attributes allow providers (separate DLLs) to extend language functionality dynamically. 属性の主な目的は、コンポーネント開発者の生産性レベルを高めることに加えて、COM コンポーネントの作成を簡略化することです。The primary goal of attributes is to simplify the authoring of COM components, in addition to increasing the productivity level of the component developer. 属性は、クラス、データメンバー C++ 、メンバー関数など、ほぼすべてのコンストラクトに適用できます。Attributes can be applied to nearly any C++ construct, such as classes, data members, or member functions. この新しいテクノロジによってもたらされる利点を次に示します。The following is a highlight of benefits provided by this new technology:

  • は、使い慣れた簡単な呼び出し規約を公開します。Exposes a familiar and simple calling convention.

  • 挿入されたコードを使用します。これはマクロとは異なり、デバッガーによって認識されます。Uses inserted code, which, unlike macros, is recognized by the debugger.

  • は、非常に面倒な実装の詳細がなくても、基本クラスから簡単に派生できます。Allows easy derivation from base classes without burdensome implementation details.

  • COM コンポーネントに必要な大量の IDL コードを、簡潔な属性で置き換えます。Replaces the large amount of IDL code required by a COM component with a few concise attributes.

たとえば、汎用 ATL クラスの単純なイベントシンクを実装するには、CMyReceiverなどの特定のクラスにevent_receiver属性を適用します。For example, to implement a simple event sink for a generic ATL class, you could apply the event_receiver attribute to a specific class such as CMyReceiver. 次に、event_receiver 属性が Microsoft C++コンパイラによってコンパイルされます。これにより、オブジェクトファイルに適切なコードが挿入されます。The event_receiver attribute is then compiled by the Microsoft C++ compiler, which inserts the proper code into the object file.

[event_receiver(com)]
class CMyReceiver
{
   void handler1(int i) { ... }
   void handler2(int i, float j) { ... }
}

次に、CMyReceiver メソッドを設定して、イベント (組み込み関数__hook) からイベントを処理 ( event_sourceを使用して作成できる) を handler1 し、handler2 することができます。You can then set up the CMyReceiver methods handler1 and handler2 to handle events (using the intrinsic function __hook) from an event source, which you can create using event_source.

属性の基本的なしくみBasic Mechanics of Attributes

プロジェクトに属性を挿入するには、次の3つの方法があります。There are three ways to insert attributes into your project. 最初に、ソースコードに手動で挿入することができます。First, you can insert them manually into your source code. 2つ目は、プロジェクト内のオブジェクトのプロパティグリッドを使用して、それらを挿入する方法です。Second, you can insert them using the property grid of an object in your project. 最後に、さまざまなウィザードを使用して挿入できます。Finally, you can insert them using the various wizards. [プロパティ] ウィンドウおよびさまざまなウィザードの使用方法の詳細については、「 Visual Studio プロジェクト- C++ 」を参照してください。For more information on using the Properties window and the various wizards, see Visual Studio Projects - C++.

前と同様に、プロジェクトをビルドすると、コンパイラはC++各ソースファイルを解析してオブジェクトファイルを生成します。As before, when the project is built, the compiler parses each C++ source file, producing an object file. ただし、コンパイラが属性を検出すると、解析され、構文的に検証されます。However, when the compiler encounters an attribute, it is parsed and syntactically verified. コンパイラは、コンパイル時にコードを挿入したり他の変更を加えたりするために、属性プロバイダーを動的に呼び出します。The compiler then dynamically calls an attribute provider to insert code or make other modifications at compile time. プロバイダーの実装は、属性の型によって異なります。The implementation of the provider differs depending on the type of attribute. たとえば、ATL 関連の属性は Atlprov によって実装されます。For example, ATL-related attributes are implemented by Atlprov.dll.

次の図は、コンパイラと属性プロバイダーの関係を示しています。The following figure demonstrates the relationship between the compiler and the attribute provider.

コンポーネント属性の通信Component attribute communication

注意

属性の使用法では、ソースファイルの内容は変更されません。Attribute usage does not alter the contents of the source file. 生成された属性コードが表示されるのは、デバッグセッション中のみです。The only time the generated attribute code is visible is during debugging sessions. さらに、プロジェクト内の各ソースファイルに対して、属性の置換の結果を表示するテキストファイルを生成できます。In addition, for each source file in the project, you can generate a text file that displays the results of the attribute substitution. この手順の詳細については、「 /fx (挿入されたコードのマージ)」および「挿入されたコードのデバッグ」を参照してください。For more information on this procedure, see /Fx (Merge Injected Code) and Debugging Injected Code.

ほとんどC++の構成要素と同様に、属性には適切な使用法を定義する一連の特性があります。Like most C++ constructs, attributes have a set of characteristics that defines their proper usage. これは、属性のコンテキストと呼ばれ、各属性参照トピックの属性コンテキストテーブルでアドレス指定されます。This is referred to as the context of the attribute and is addressed in the attribute context table for each attribute reference topic. たとえば、コクラス属性は、既存のクラスまたは構造体にのみ適用できます。 cpp_quote属性は、 C++ソースファイル内の任意の場所に挿入できます。For example, the coclass attribute can only be applied to an existing class or structure, as opposed to the cpp_quote attribute, which can be inserted anywhere within a C++ source file.

属性付きプログラムの作成Building an Attributed Program

ソースコードに視覚的C++な属性を設定したら、Microsoft C++コンパイラでタイプライブラリと .idl ファイルを生成することができます。After you put Visual C++ attributes into your source code, you may want the Microsoft C++ compiler to produce a type library and .idl file for you. 次のリンカーオプションは、.tlb ファイルと .idl ファイルをビルドするのに役立ちます。The following linker options help you build .tlb and .idl files:

一部のプロジェクトには、複数の独立した .idl ファイルが含まれています。Some projects contain multiple independent .idl files. これらは、2つ以上の .tlb ファイルを生成し、必要に応じてリソースブロックにバインドするために使用されます。These are used to produce two or more .tlb files and optionally bind them into the resource block. このシナリオは、現在、ビジュアルC++ではサポートされていません。This scenario is not currently supported in Visual C++.

さらに、Visual C++リンカーは、すべての IDL 関連の属性情報を1つの MIDL ファイルに出力します。In addition, the Visual C++ linker will output all IDL-related attribute information to a single MIDL file. 1つのプロジェクトから2つのタイプライブラリを生成する方法はありません。There will be no way to generate two type libraries from a single project.

属性コンテキストAttribute Contexts

C++属性を記述するには、4つの基本的なフィールドを使用します。これらのフィールドは、適用先 (適用先)、 反復可能かどうか (反復可能)、他の属性の存在が必要である (必須属性)、および他の属性との非互換性 (無効な属性) です。C++ attributes can be described using four basic fields: the target they can be applied to (Applies To), if they are repeatable or not (Repeatable), the required presence of other attributes (Required Attributes), and incompatibilities with other attributes (Invalid Attributes). これらのフィールドは、各属性のリファレンストピックの関連するテーブルに一覧表示されます。These fields are listed in an accompanying table in each attribute's reference topic. これらの各フィールドについて以下に説明します。Each of these fields is described below.

適用対象Applies To

このフィールドは、指定C++された属性の有効なターゲットであるさまざまな言語要素について説明します。This field describes the different C++ language elements that are legal targets for the specified attribute. たとえば、属性が [適用先] フィールドで "class" を指定している場合、この属性は有効C++なクラスにのみ適用できることを示します。For instance, if an attribute specifies "class" in the Applies To field, this indicates that the attribute can only be applied to a legal C++ class. 属性がクラスのメンバー関数に適用されている場合、構文エラーが発生します。If the attribute is applied to a member function of a class, a syntax error would result.

詳細については、「使用法別の属性」を参照してください。For more information, see Attributes by Usage.

反復可能Repeatable

このフィールドは、属性を同じターゲットに繰り返し適用できるかどうかを示します。This field states whether the attribute can be repeatedly applied to the same target. 属性の大部分は反復可能ではありません。The majority of attributes are not repeatable.

必要な属性Required Attributes

このフィールドには、指定した属性が正しく機能するために存在する必要がある (つまり、同じターゲットに適用される) 他の属性が一覧表示されます。This field lists other attributes that need to be present (that is, applied to the same target) for the specified attribute to function properly. 属性にこのフィールドのエントリが含まれていることは珍しくありません。It is uncommon for an attribute to have any entries for this field.

無効な属性Invalid Attributes

このフィールドには、指定した属性と互換性のない他の属性が一覧表示されます。This field lists other attributes that are incompatible with the specified attribute. 属性にこのフィールドのエントリが含まれていることは珍しくありません。It is uncommon for an attribute to have any entries for this field.

このセクションの内容In This Section

属性プログラミングの FAQAttribute Programming FAQ
グループ別の属性Attributes by Group
使用法別の属性Attributes by Usage
属性リファレンス (アルファベット順)Attributes Alphabetical Reference