如何解决WinRT中IDL文件的“参数化接口的参数无效”错误?

时间:2019-06-26 19:17:12

标签: winrt-async c++-winrt

尝试为Windows运行时组件类编写IDL文件时,出现“参数化接口的参数无效”错误。

RunAsync()函数在标头中返回winrt :: Windows :: Foundation :: IAsyncOperation,并将其翻译为winrt.Windows.Foundation.IAsyncOperation,因为https://docs.microsoft.com/en-us/uwp/winrt-cref/winrt-type-system指出UInt32是“基本类型”,而“允许[WinRT基本类型]出现在参数化类型的参数列表中。”

//ConnectTask.idl
namespace NOVAShared
{
    [default_interface]
    runtimeclass ConnectTask
    {
        ConnectTask();
        winrt.Windows.Foundation.IAsyncOperation<UInt32> RunAsync();
    };
}
//ConnectTask.h
namespace winrt::NOVAShared::implementation
{
    struct ConnectTask : ConnectTaskT<ConnectTask>
    {
        ConnectTask() = default;

        static winrt::Windows::Foundation::IAsyncOperation<uint32_t> RunAsync();
    };
}

我的语法错误吗?我发现了一些IDL文件的随机示例,这似乎是正确的...

1 个答案:

答案 0 :(得分:1)

MIDL编译器的错误消息有点误导。编译以下IDL文件时

namespace NS
{
    runtimeclass MyType
    {
        foo<UInt32> bar();
    }
}

您会收到以下错误消息:

error MIDL5023: [msg]the arguments to the parameterized interface are not valid [context]: foo

但是,不是无效的参数。未知的是参数化类型(foo)。在您的情况下为winrt.Windows.Foundation.IAsyncOperation。具有该名称的类型不存在。 Windows运行时类型名称改为Windows.Foundation.IAsyncOperation(将其投影到C ++ / WinRT中的winrt名称空间中,即winrt::Windows::Foundation::IAsyncOperation)。

要解决此问题,请使用以下IDL文件:

//ConnectTask.idl
namespace NOVAShared
{
    [default_interface]
    runtimeclass ConnectTask
    {
        ConnectTask();
        Windows.Foundation.IAsyncOperation<UInt32> RunAsync();
    };
}

请注意,如果要使用静态类成员,则必须在IDL中使用static关键字。