2

COM オブジェクトの IDL では、次のことを行います。

enum TxMyFlags
{
,    flagOption = 1,
,    flagOtherOption = 2,
,    flagMoreOption = 4,
,    flagAnotherFlag = 8,
,    flagExtra = 128
// etc.
};

フラグの合計(またはビットごとのOR、同じこと)を取ることができる関数を持っています、例えば(IDLで)

HRESULT _stdcall a_method([in] enum TxMyFlags);

使用目的の例は次のとおりです。

a_method( flagExtra | flagMoreOption );

動作しているように見えますが、これは実際に許可されていますか、それとも RPC トランスポートなどで、列挙型定義に正確に含まれていない列挙型パラメーターの値が拒否される可能性はありますか?

4

1 に答える 1

4

クライアントとサーバーが処理中の場合 (実際のマシャリングが発生しておらず、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 ファイルをスキャンすると、基本的に両方を使用していることがわかります...

于 2014-07-29T06:41:15.107 に答える