如何在WinRT Component C ++ / CX中通过引用传递结构

时间:2012-05-14 13:24:50

标签: struct components windows-runtime c++-cx

我的WinRT组件中有以下内容:

public value struct WinRTStruct
{
    int x;
    int y;
};

public ref class WinRTComponent sealed
{
    public:
    WinRTComponent();
    int TestPointerParam(WinRTStruct * wintRTStruct);
};

int WinRTComponent::TestPointerParam(WinRTStruct * wintRTStruct)
{
    wintRTStruct->y = wintRTStruct->y + 100;
    return wintRTStruct->x;
}

但是,当从C#调用时,似乎winRTStruct-> y和x的值在方法内始终为0:

WinRTComponent comp = new WinRTComponent();
WinRTStruct winRTStruct;
winRTStruct.x = 100;
winRTStruct.y = 200;
comp.TestPointerParam(out winRTStruct);
textBlock8.Text = winRTStruct.y.ToString();

通过引用传递结构的正确方法是什么,以便在用C ++ / CX编写的WinRTComponent的方法中更新?

2 个答案:

答案 0 :(得分:3)

您不能通过引用传递结构。 winrt中的所有值类型(包括结构)都按值传递。 Winrt结构预计相对较小 - 它们用于保存Point和Rect之类的东西。

在您的情况下,您已指出结构是“out”参数 - “out”参数是只写的,其内容在输入时被忽略并在返回时被复制出来。如果你想要一个结构进出,将它分成两个参数 - 一个“in”参数和另一个“out”参数(WinRT中不允许输入/输出参数,因为它们没有按照你期望的方式投射到JS他们投射)。

答案 1 :(得分:1)

我的同事帮我解决了这个问题。 在WinRT组件中,似乎最好的方法是定义一个ref结构而不是一个值struct:

public ref struct WinRTStruct2 sealed
{
private: int _x;
public:
 property int X
 {
    int get(){ return _x; }
    void set(int value){ _x = value; }
 }
private: int _y;
public:
 property int Y
 {
    int get(){ return _y; }
    void set(int value){ _y = value; }
 }
};

但这会产生其他问题。现在,当我尝试向返回结构实例的ref结构添加方法时,VS11编译器提供了INTERNAL COMPILER ERROR。