尝试为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文件的随机示例,这似乎是正确的...
答案 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
关键字。