Как исправить 'аргументы в параметризованном интерфейсе не действительны' ошибка файла IDL в WinRT? - PullRequest
1 голос
/ 26 июня 2019

Я получаю сообщение об ошибке «аргументы параметризованного интерфейса недопустимы» при попытке записи файла IDL для моего класса компонентов среды выполнения Windows.

Функция 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 Ответ

1 голос
/ 27 июня 2019

Сообщение об ошибке компилятора 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 (которое проецируется в пространство имен winrt в C ++ / WinRT, т.е. winrt::Windows::Foundation::IAsyncOperation).

Чтобы устранить проблему, используйте следующий файл IDL:

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

Обратите внимание, что если вам нужен статический член класса, вам придется использовать ключевое слово static в IDL.

...