如何在C ++ CX Windows运行时组件中定义'out'参数?

时间:2013-04-10 07:40:57

标签: windows-runtime c++-cx

根据谷歌的外观,似乎这可能是不可能的,但是:

如何在C ++ / CX'ref类'中定义'out'参数?

如果您的答案是无法做到的,请提供参考。

3 个答案:

答案 0 :(得分:9)

任何类型T*的参数(其中T是ABI合法类型)将被编译器视为out参数,并在元数据中进行修饰。以下代码:

namespace TestMakePublic {
 public ref class Class1 sealed
 {
 public:
   void foo(int* out1, Object^* out2){}
 };
}

在元数据中生成一个如下所示的函数(ildasm输出):

.method public hidebysig newslot virtual final 
        instance void  foo([out] int32& out1,
                           [out] object& out2) runtime managed
{
  .override TestMakePublic.__IClass1PublicNonVirtuals::foo
} // end of method Class1::foo

请注意,WinRT 支持“输入/输出”参数,因此out1out2的值仅对返回有效来自该功能, 无法信任 作为foo的输入。

答案 1 :(得分:2)

它是一个C#特定关键字,COM在IDL语法中也有它。 MSVC ++中的等价物是[out]属性。

但不,如果您尝试使用它,编译器将拒绝使用C3115。请记住,您使用C ++ / CX语言扩展来编写其他语言使用的代码。这通常支持[out]的概念很差。像vb.net这样的C ++,Javascript或.NET语言都不支持它。您也可以在C:\ Program Files(x86)\ Windows Kits \ 8.0 \ Include \ WinRT中的.h文件中看到这一点,这些文件是从具有[out]属性的同一目录中的.idl文件生成的。它被midl在.h文件中删除。

无论如何都没关系,因为你的代码将在进程中使用,因此[out]能够优化参数值的编组没有任何好处。只需一个普通指针即可完成工作。然而,必须在C#代码中初始化参数值是不可避免的损失。

答案 2 :(得分:1)

您可以使用:

  1. _Out_opt_
  2. _Out_
  3. 但这些仅适用于私人,内部和受保护的成员AFAIK。