2012-05-14 40 views
3

我已經在我的WinRT組件如下:如何通過WinRT中組分C++/CX參考傳遞結構

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; 
} 

但是,似乎的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的方法內被更新的正確的方法:該方法中,從C#調用時內?

+1

我不知道如何在WinRT中通過引用工作,但在C#中,如果您使用'out'傳遞參數,則不使用原始值,則需要'ref'。 – svick

+0

@svick我在這裏有點晚,但是我想補充一點,你可以選擇使用'ref'或'&'符號(例如:'comp.TestPointerParam(&winRTStruct)' https:// msdn .microsoft.com/EN-US /庫/ hh699870.aspx – user3164339

回答

3

您不能通過引用傳遞結構。所有值類型(包括結構)在winrt中都是按值傳遞的。 Winrt結構預計會相對較小 - 它們旨在用於持有像Point和Rect之類的東西。

就你而言,你已經指出struct是一個「out」參數 - 「out」參數是隻寫的,其內容在輸入時被忽略,並在返回時被複製出來。如果你想要一個結構體進入和退出,將它分成兩個參數 - 一個「in」參數和另一個「out」參數(WinRT中不允許輸入/輸出參數,因爲它們不按照你期望的方式投射到JS上他們去投影)。

1

我的同事幫我解決了這個問題。 在WinRT的成分,似乎要做到這一點的最好辦法是定義一個參考結構,而不是一個值的結構:

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。