Bagikan melalui


Transisi ke MIDL 3.0 dari MIDLRT klasik

MIDLRT juga dikenal sebagai MIDL 2.0. Lihat MIDL 1.0, 2.0, dan 3.0.

MIDL 3.0 dapat berdampingan dalam file sumber yang sama dengan MIDLRT klasik; Anda tidak diharuskan untuk mengonversi file IDL sekaligus. Tidak ada opsi kompilator baru yang diperlukan untuk mengekspresikan bahwa Anda menggunakan MIDL 3.0. Opsi yang /winrt ada memungkinkan MIDLRT klasik dan MIDL 3.0.

Anda dapat menambahkan konten MIDL 3.0 ke jenis MIDLRT yang ada. Secara khusus, Anda dapat menggunakan MIDL 3.0 untuk menentukan antarmuka yang ditambahkan ke definisi kelas runtime yang ditulis di MIDLRT. Ini memungkinkan penggunaan teknik baru, meskipun tidak memerlukan konversi penuh dari jenis atau file. Berikut contohnya.

// 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;
}

Menambahkan konstruksi MIDL 3.0 ke dalam definisi runtimeclass MIDLRT yang ada menghasilkan kesalahan seperti ini.

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'

Perbaiki ini baik dengan mengonversi kelas penuh ke MIDL 3.0, atau dengan teknik di atas yang menambahkan antarmuka baru dan menambahkannya ke kelas .