3

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のメソッド内で更新されるように、参照によって構造体を渡す正しい方法は何ですか?

4

2 に答える 2

4

参照によって構造体を渡すことはできません。winrtのすべての値型(構造体を含む)は値によって渡されます。Winrt構造体は比較的小さいと予想されます。これは、PointやRectなどを保持するために使用することを目的としています。

あなたの場合、構造体が「out」パラメーターであることを示しました。「out」パラメーターは書き込み専用であり、その内容は入力時に無視され、戻り時にコピーされます。構造体をインとアウトにする場合は、2つのパラメーターに分割します。1つは「in」パラメーター、もう1つは「out」パラメーターです(WinRTでは、期待どおりにJSに投影されないため、in/outパラメーターは使用できません。それらを投影する)。

于 2012-05-15T02:48:32.993 に答える
1

私の同僚は私がこれを解決するのを手伝ってくれました。WinRTコンポーネントでは、これを行うための最良の方法は、値構造体の代わりにref構造体を定義することであるように思われます。

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コンパイラで内部コンパイラエラーが発生するようになりました。

于 2012-05-15T13:36:05.493 に答える