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

Ome*_*viv 6 windows-runtime c++-cx

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

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

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

And*_*ich 9

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

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

在元数据中生成一个看起来像这样的函数(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
Run Code Online (Sandbox Code Playgroud)

需要注意的是WinRT中并没有支持"IN/OUT"参数,这样的价值out1out2仅适用于从函数返回,并且不能被信任的输入foo.


Han*_*ant 2

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

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

无论如何,这并不重要,因为您的代码将在进程中使用,因此[out]能够优化参数值的封送处理根本没有任何好处。只需一个简单的指针即可完成工作。然而,必须在 C# 代码中初始化参数值是不可避免的损失。