Compartir a través de


Transición a MIDL 3.0 desde la versión clásica de MIDLRT

MIDLRT también se conoce como MIDL 2.0. Consulte MIDL 1.0, 2.0 y 3.0.

MIDL 3.0 puede coexistir en el mismo archivo de código fuente con MIDLRT clásico; No es necesario convertir el archivo IDL a la vez. No se requiere ninguna nueva opción del compilador para expresar que usa MIDL 3.0. La opción /winrt existente habilita midlrt clásico y MIDL 3.0.

Puede agregar contenido midl 3.0 a un tipo MIDLRT existente. En concreto, puede usar MIDL 3.0 para definir interfaces que se agregan a las definiciones de clase en tiempo de ejecución que se han escrito en MIDLRT. Esto permite usar nuevas técnicas, a la vez que no requiere una conversión completa de un tipo o un archivo. A continuación se muestra un ejemplo.

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

La adición de construcciones MIDL 3.0 en definiciones runtimeclass de MIDLRT existentes genera un error como este.

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'

Corrija esto mediante la conversión de la clase completa a MIDL 3.0, o bien mediante la técnica anterior que agrega una nueva interfaz y la agrega a la clase .