在WinRT语言中装箱值对象

时间:2016-08-11 13:45:47

标签: com windows-runtime

我正在为WinRT接口编写一个C ++实现,它需要将一个通用数据公开为IInspectable *。这段数据可以是一个IInspectable *本身,一个内置值,或一组有限的复合值类型(例如Windows :: Foundation :: Numerics :: Vector4,Matrix4x4,或我的库中定义的一些值类型) 。有什么正确的方法可以从C ++以外的语言访问数据?

以下是我尝试这样做的方法。当数据是内置值时,我使用IPropertyValueStatics中的方法将其置于IPropertyValue中,并且在我处理的所有语言(C ++,C ++ / CX,C#)中一切正常。对于结构体,我尝试在IReference接口的实现中装箱。

所以在我的IDL中我有:

declare
{
    interface Windows.Foundation.IReference<Windows.Foundation.Numerics.Vector4>
}

并在cpp中:

using ABI::Windows::Foundation::Numerics::Vector4;
using ABI::Windows::Foundation::IReference;
struct Reference_Vector4
    : public Microsoft::WRL::RuntimeClass< IReference<Vector4> >
{
    InspectableClass(L"Reference_Vector4", BaseTrust );
public:     
    STDMETHOD(get_Value)(Vector4* res) { ... }
};

https://msdn.microsoft.com/en-us/library/windows/apps/br225864.aspx?f=255&MSPPError=-2147217396开始,我希望能够在C ++ / CX中将Reference_Vector4的实例作为IBox访问,在C#中作为Nullable访问,但这对我不起作用。具体做法是:

Object^ obj = <some instance of Reference_Vector4>;

IUnknown* raw = reinterpret_cast<IUnknown>(obj);
ComPtr< IReference<Vector4> > r; 
raw->QueryInterface<IReference<Vector4>>(&r); // this succeeds

auto vec = dynamic_cast<Platform::IBox<float4>^>(obj); // this fails
auto vec2 = reinterpret_cast<Platform::IBox<float4>^>(obj); // this works (can read the correct float4)

我有什么问题吗?

0 个答案:

没有答案