Почему `cpp_quote` и `pragma midl_echo`, используемые в файле .idl, ничего не выводят в сгенерированный заголовок в проекте C++/WinRT?

Я пытаюсь добавить некоторый код C++ в сгенерированный заголовок, поступающий от компилятора MIDL, используя атрибут cpp_quote. Но к сгенерированному выводу ничего не добавляется, и я понятия не имею, почему.

Я использую VS 2019 с расширением C++/WinRT, проект представляет собой проект C++/WinRT с конфигурацией по умолчанию.

Входной IDL-файл:

cpp_quote("#define FOO")

namespace FooWinRT
{
    runtimeclass Class
    {
        Class();
        Int32 MyProperty;
    }
}

Сгенерированный вывод:

// WARNING: Please don't edit this file. It was generated by C++/WinRT v2.0.200224.2

#pragma once
#include "winrt/FooWinRT.h"
namespace winrt::FooWinRT::implementation
{
    template <typename D, typename... I>
    struct __declspec(empty_bases) Class_base : implements<D, FooWinRT::Class, I...>
    {
        using base_type = Class_base;
        using class_type = FooWinRT::Class;
        using implements_type = typename Class_base::implements_type;
        using implements_type::implements_type;

        hstring GetRuntimeClassName() const
        {
            return L"FooWinRT.Class";
        }
    };
}
namespace winrt::FooWinRT::factory_implementation
{
    template <typename D, typename T, typename... I>
    struct __declspec(empty_bases) ClassT : implements<D, Windows::Foundation::IActivationFactory, I...>
    {
        using instance_type = FooWinRT::Class;

        hstring GetRuntimeClassName() const
        {
            return L"FooWinRT.Class";
        }
        auto ActivateInstance() const
        {
            return make<T>();
        }
    };
}

#if defined(WINRT_FORCE_INCLUDE_CLASS_XAML_G_H) || __has_include("Class.xaml.g.h")
#include "Class.xaml.g.h"
#else

namespace winrt::FooWinRT::implementation
{
    template <typename D, typename... I>
    using ClassT = Class_base<D, I...>;
}

#endif

(Конечно, фактический производственный код более сложен, это всего лишь минимальный пример того, что я пытаюсь сделать.)

Что мне не хватает, почему он не делает то, что должен делать?


person Balázs Kovacsics    schedule 26.02.2020    source источник


Ответы (1)


Заголовок "создан C++/WinRT v2.0.200224.2", т. е. cppwinrt.exe, а не midl[rt].exe. Последний создает файл .winmd, который используется первым для создания заголовка реализации. Я не знаю, как проинструктировать инструменты, чтобы cpp_quote отображались в заголовках реализации.

person IInspectable    schedule 26.02.2020
comment
Я понимаю. Я только начал разработку для Windows и не знал, что midl можно использовать без WinRT. - person Balázs Kovacsics; 27.02.2020
comment
Можно ли каким-либо образом определить перечисление в простом midl с некоторыми cpp_quotes и использовать его в классе времени выполнения WinRT? - person Balázs Kovacsics; 27.02.2020
comment
@bal: Нет. Если ваше перечисление отображается в подписи типа среды выполнения Windows, вам придется объявить его в IDL, а MIDL сгенерирует соответствующие метаданные. Если перечисление является внутренним для реализации, то нет необходимости помещать его в IDL. - person IInspectable; 27.02.2020