次の方法で共有


従来の MIDLRT から MIDL 3.0 への移行

MIDLRT は MIDL 2.0 とも呼ばれます。 「 MIDL 1.0、2.0、および 3.0」を参照してください。

MIDL 3.0 は、クラシック MIDLRT と同じソースファイルに共存できます。IDL ファイルをすべて一度に変換する必要はありません。 MIDL 3.0 を使用していることを表現するために、新しいコンパイラオプションは必要ありません。 既存 /winrt のオプションでは、クラシック MIDLRT と MIDL 3.0 の両方が有効になります。

MIDL 3.0 のコンテンツは、既存の MIDLRT 型に追加できます。 具体的には、MIDL 3.0 を使用して、MIDLRT で作成されたランタイムクラス定義に追加されるインターフェイスを定義できます。 これにより、新しい手法を使用できますが、型またはファイルの完全な変換は必要ありません。 次に例を示します。

// Existing RTIDL interface definition.
[contract(FooContract, 1), exclusiveto(SampleClass), uuid(...)]
interface ISampleClass : IInspectable
{
    HRESULT Method1([in] boolean something, [in] HSTRING other);
}

// New MIDL 3.0 interface added; needs exclusiveto(), but not uuid().
[contract(FooContract, 2), exclusiveto(SampleClass)]
interface ISampleClass2
{
    Windows.Foundation.IAsyncOperation<String> TransformAsync(UInt32 count);
    String NameProperty { get; };
}

[contract(FooContract, 1)]
runtimeclass SampleClass
{
    [default] interface ISampleClass;
    // Reference to MIDL 3.0-defined interface.
    [contract(FooContract, 2)] interface ISampleClass2;
}

MIDL 3.0 コンストラクトを既存の MIDLRT runtimeclass 定義に追加すると、次のようなエラーが発生します。

1>midl : error MIDL9008 : internal compiler problem - See documentation for suggestions on how to find a workaround.
errors in directory t:\compdev1\src\mincore\coreui\published\idl
t:\compdev1\src\midl : error MIDL9008 : internal compiler problem - See documentation for suggestions on how to find a workaround.
1>midl: Assertion failed: pN->NodeKind() == NODE_INTERFACE_GROUP_MEMBER, file com\rpc\midl\midlrt\front\nodeskl.cxx, line 1403
1>NMAKE : fatal error U1077: 't:\compdev1\src\tools\x86\midl.EXE' : return code '0x2330'

この問題を解決するには、完全なクラスを MIDL 3.0 に変換するか、上の手法によって新しいインターフェイスを追加し、それをクラスに追加します。