クライアントとサーバーが処理中の場合 (実際のマシャリングが発生しておらず、RPC が関与していない場合)、列挙型として問題は発生しませんが、どのように定義しても、int/long/任意の整数型の等価物として扱われます。サイズで。
したがって、おそらく問題になるのは、アウトプロセス (またはクロス アパートメント マーシャリング) のケースです。この場合、ここのドキュメントに記載されているように: enum 属性(およびコメント):
enum 型のオブジェクトは int 型であり、そのサイズはシステムに依存します。デフォルトでは、列挙型のオブジェクトは、ネットワーク経由で転送されるときに、unsigned short 型の 16 ビット オブジェクトとして扱われます。0 ~ 32,767 の範囲外の値を指定すると、実行時例外 RPC_X_ENUM_VALUE_OUT_OF_RANGE が発生します。オブジェクトを 32 ビット エンティティとして送信するには、[v1_enum] 属性を enum typedef に適用します。
したがって、idl で列挙型を使用するには、基本的に 2 つのオプションがあります。1)enum
なしで使用typedef
する方法と、2) 属性を使用enum
して属性typedef
を追加する方法v1_enum
です。最初のケースでは、ワイヤで必要に応じてメソッドで型を宣言するだけで済みます。2 番目のケースでは、その型を使用する必要があります (したがって v1_enum 属性)。
enum MY_ENUM
{
MY_ENUM_FIRST = 1,
MY_ENUM_SECOND = 2,
};
typedef [v1_enum] enum
{
MY_ENUM_TYPE_FIRST = 1,
MY_ENUM_TYPE_SECOND = 2
} MY_ENUM_TYPE;
[object, uuid(15A7560E-901B-44D2-B841-58620B1A76C5)]
interface IMyInterface : IUnknown
{
HRESULT MyMethod1(int myParam);
HRESULT MyMethod2(MY_ENUM_TYPE myParam);
};
次のように使用します。
IMyInterface *p = ...;
p->MyMethod1(MY_ENUM_FIRST | MY_ENUM_SECOND);
p->MyMethod2(MY_ENUM_TYPE::MY_ENUM_TYPE_FIRST | MY_ENUM_TYPE::MY_ENUM_TYPE_SECOND);
次のようなメソッドを宣言すると:
HRESULT MyMethod1(enum MY_ENUM myParam);
次に、16ビットの列挙型を使用します(また、typedefされていない列挙型にv1_enumを追加することはできません)ので、それは良くありません(0〜32767の制限で問題ない場合を除きます)。
注: 2 行目で typedef enum をフラグとして変換するのを容易にするために、これも宣言しました。
MY_ENUM_TYPE operator | (MY_ENUM_TYPE l, MY_ENUM_TYPE r) { return (MY_ENUM_TYPE)((int)l | (int)r); }
良い。typedef の方法は少しやり過ぎに思えますが、型付けされるという利点があります。Windows SDK で Microsof 独自の .IDL ファイルをスキャンすると、基本的に両方を使用していることがわかります...