为什么 .idl 文件中使用的“cpp_quote”和“pragma midl_echo”不向 C++/WinRT 项目中生成的 header 输出任何内容?
Why doesn't `cpp_quote` and `pragma midl_echo` used in a .idl file output anything to the generated header in a C++/WinRT project?
我正在尝试使用 cpp_quote attribute 向 MIDL 编译器生成的 header 添加一些 C++ 代码。
但是生成的输出中没有添加任何内容,我不知道为什么。
我使用带有 C++/WinRT 扩展的 VS 2019,该项目是一个具有默认配置的 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
(当然实际的生产代码更复杂,这只是我正在尝试做的一个最小的例子。)
我错过了什么,为什么它没有做它应该做的事情?
header"was generated by C++/WinRT v2.0.200224.2"即cppwinrt.exe,不是midl[rt].exe。后者生成一个 .winmd 文件,前者使用该文件发出实现 header。我不知道如何指示工具使 cpp_quote
s 出现在实现 headers.
中
我正在尝试使用 cpp_quote attribute 向 MIDL 编译器生成的 header 添加一些 C++ 代码。 但是生成的输出中没有添加任何内容,我不知道为什么。
我使用带有 C++/WinRT 扩展的 VS 2019,该项目是一个具有默认配置的 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
(当然实际的生产代码更复杂,这只是我正在尝试做的一个最小的例子。)
我错过了什么,为什么它没有做它应该做的事情?
header"was generated by C++/WinRT v2.0.200224.2"即cppwinrt.exe,不是midl[rt].exe。后者生成一个 .winmd 文件,前者使用该文件发出实现 header。我不知道如何指示工具使 cpp_quote
s 出现在实现 headers.