【问题标题】:Can I add 'operations' to runtimeclass in a winrt component我可以将“操作”添加到 winrt 组件中的运行时类吗
【发布时间】:2019-08-12 19:36:24
【问题描述】:

在下面的代码中,“RuntimeMethod1()” 是一个操作。它不接受任何输入参数,也不返回任何结果。 运行时类中是否允许使用这种方法?

我收到此运行时类的编译错误。它说

在第 7 行的“(”附近需要一个标识符

namespace UniversalRuntimeComponent  
{  
    [default_interface]  
    runtimeclass Class  
    {  
        Class();  
        RuntimeMethod1();  
        Int32 RuntimeMethod2(Int32 arg1);  
        String RuntimeMethod3(String arg1);  
    }  
}

如果我从类中删除“RuntimeMethod1()”,那么它可以正常编译并生成投影和实现类型。

【问题讨论】:

    标签: windows-runtime c++-winrt winrt-component


    【解决方案1】:

    如果它不返回结果,则使其返回类型为 void。

    将 IDL 中的第 7 行更改为以下内容:

    void RuntimeMethod1(); 
    

    然后从自动生成的 .h 文件中复制并粘贴方法,或者手动添加。

    【讨论】:

    • 虽然这可行,但我一直在寻找 void 的运行时等效项。这是因为在 Windows::Foundation 中定义了其他数据类型,例如 Int32、String 等。使用 WinRT 类型将有助于为正确的平台生成正确的类型。此外,Windows::Foundation 定义了一个名为 'Empty' 的类型,它不是 void。 c/cpp 'void' 类型是唯一的出路吗?
    • 您编写的 RuntimeMethod1() 操作看起来像是方法调用而不是声明。数据类型 Int32、String 未在 Windows::Foundation 中定义,它会在编译时找到它的相关投影类型(如String->winrt::hstring)。在Windows::Foundation中没有找到“Empty”类型。描述不返回值的方法时,只能用void来修改。
    【解决方案2】:

    除了构造函数,MIDL 3.0 中的所有方法都需要声明返回类型。该文档在methods 上有以下内容要说:

    一个方法有一个(可能是空的)参数列表,这些参数表示传递给该方法的值或变量引用。方法也有一个返回类型,它指定方法计算和返回的值的类型。 如果方法不返回值,则其返回类型为void

    您必须将 MIDL 更改为以下内容:

    namespace UniversalRuntimeComponent  
    {  
        [default_interface]  
        runtimeclass Class  
        {  
            Class();  
            void RuntimeMethod1();  
            Int32 RuntimeMethod2(Int32 arg1);  
            String RuntimeMethod3(String arg1);  
        }  
    }
    

    注意,MIDL 中声明的数据类型遵循 MIDL 规范。这与 Windows 运行时类型系统并不严格相关,尽管所有 MIDL 数据类型都映射到可以在 Windows 运行时类型系统中表示的数据类型。

    另请注意,Windows 运行时中的 所有 方法在 ABI 中至少有一个返回值。在 MIDL 中使用 void 声明的方法仍将返回 HRESULT 以传达错误或成功。

    【讨论】:

    • 所有人都同意,但从句法的角度来看,我很乐意使用 VOID、PVOID 之类的东西来代替 void。当 MIDL 定义了诸如 Int32 之类的类型时,它只不过是 int 和 String,它根据使用者进行了适当的映射,那么为什么不定义 VOID?
    • 我知道除了使用 void 之外别无选择,并且没有必要争论它,但我想提请注意,以便 MIDL 团队可以考虑。在您发布的摘录中,它说“如果方法的返回类型不返回值,则它是无效的”,我是说给我一个语法来表示返回类型在 Int32 和 String 行中是无效的。
    • 您似乎混淆了 MIDL 的目的:它是一种接口定义语言,与 C++(或任何其他编程语言)无关。 MIDL 中的Int32 需要使用二进制补码表示; C++ 中的 int 不是。同样,需要 MIDL 中的 Single 才能使用 IEEE 表示。同样,C++ 中的 float 不是。我不确定你想改变什么。 void 是用于指定不返回值的方法的关键字。 MIDL 团队应该改变什么,需要解决哪些问题?让解析器更复杂需要一个充分的理由。
    • 我很理解这些概念,我不会在这些方面争论。我只是在谈论语言的完整性。就像,有 void 和 void* 的类型定义,开发人员使用 VOID 和 PVOID。为什么我们需要 void 和 void* typedef?关键是,无论是类型还是关键字,它都应该有一种属于 MIDL 的感觉,尤其是当相似的关键字和类型有这种归属感同时又类似于 c++ 语言时。上面的颜色是在谈论语法。无论如何,这个话题不值得花时间。所以我想在这里停止讨论。
    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多