如何在 C++CX Windows 运行时组件中定义“输出”参数?

Posted

技术标签:

【中文标题】如何在 C++CX Windows 运行时组件中定义“输出”参数?【英文标题】:How do I define 'out' parameters a in C++CX Windows Runtime Component? 【发布时间】:2013-04-01 22:30:34 【问题描述】:

在 Google 看来,这似乎是不可能的,但是:

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

如果您的回答是这不可能,请提供参考。

【问题讨论】:

【参考方案1】:

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

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支持“in/out”参数,所以out1out2的值只对函数返回有效,并且不能被信任作为foo的输入。

【讨论】:

有用的答案。您在官方文档中有对此的参考吗?【参考方案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# 代码中初始化参数值是不可避免的损失。

【讨论】:

【参考方案3】:

你可以使用:

    _Out_opt_ _Out_

但这些仅适用于私人、内部和受保护的成员 AFAIK。

【讨论】:

这些是 SAL 注释,只影响静态代码分析。在正常编译中,它们的评估结果为零。

以上是关于如何在 C++CX Windows 运行时组件中定义“输出”参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 运行时组件中的 Windows Phone 8.1 XAML 应用程序中使用 C++ dll

在 Windows 7 中使用 cx_freeze 创建的可执行文件在其他计算机上运行时崩溃并出现有关 PyQt5 的错误

泛型在 C++/CX 中的工作原理

如何在 Metro (C++/CX) 应用程序中解析日期?

这个 cx_Freeze 错误是啥意思?

CX_Freeze 和 guiqwt 适用于 windows 而不是 linux