Transition vers MIDL 3.0 à partir de MIDLRT classique

MIDLRT est également appelé MIDL 2,0. Consultez MIDL 1,0, 2,0 et 3,0.

MIDL 3,0 peut coexister dans le même fichier source avec les MIDLRT classiques. vous n’avez pas besoin de convertir le fichier IDL en une seule fois. Aucune nouvelle option du compilateur n’est requise pour exprimer que vous utilisez MIDL 3,0. L’option existing /winrt active les MIDLRT classiques et MIDL 3,0.

Vous pouvez ajouter le contenu MIDL 3,0 à un type MIDLRT existant. Plus précisément, vous pouvez utiliser MIDL 3,0 pour définir les interfaces ajoutées aux définitions de la classe Runtime créées dans MIDLRT. Cela permet d’utiliser de nouvelles techniques, sans nécessiter une conversion complète d’un type ou d’un fichier. Voici un exemple.

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

L’ajout de constructions MIDL 3,0 dans les définitions MIDLRT runtimeclass existantes génère une erreur de ce type.

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'

Pour résoudre ce problème, vous devez convertir la classe complète en MIDL 3,0 ou la technique ci-dessus qui ajoute une nouvelle interface et l’ajoute à la classe.