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

Com 跨WinRT语言装箱值对象 我正在编写一个C++实现,它需要将一个通用的数据作为IcTestTe*公开。这段数据可以是IInspectable*本身、内置值或有限组复合值类型之一(例如Windows::Foundation::Numerics::Vector4、Matrix4x4或我的库中定义的一些值类型)。这样做的正确方法是什么,可以从C++以外的语言访问数据?,com,windows-runtime,Com,Windows Runtime,以下是我如何努力做到这一点。当数据块是内置值时,我使用iPropertyValuesStatics中的方法将其放入iPropertyValues中,并且在我所处理的所有语言(C++,C++/CX,C#)中,一切都可以正常工作。对于结构,我尝试将它们装箱到IReference接口的实现中 因此,在我的IDL中,我有: declare { interface Windows.Foundation.IReference<Windows.Foundation.Numerics.Vector

以下是我如何努力做到这一点。当数据块是内置值时,我使用iPropertyValuesStatics中的方法将其放入iPropertyValues中,并且在我所处理的所有语言(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) { ... }
};
使用ABI::Windows::Foundation::Numerics::Vector4;
使用ABI::Windows::Foundation::IReference;
结构参考向量4
:public Microsoft::WRL::RuntimeClass
{
可检查类(L“参考向量4”,BaseTrust);
公众:
STDMETHOD(get_值)(Vector4*res){…}
};
从那时起,我希望能够在C++/CX中以IBox的形式访问Reference_Vector4的实例,在C#中以null的形式访问,但这对我不起作用。具体而言:

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)
Object^obj=;
IUnknown*raw=重新解释铸件(obj);
ComPtrr;
原始->查询接口(&r);//这成功了
自动矢量=动态_投射(obj);//这失败了
auto vec2=重新解释铸件(obj);//此操作有效(可以读取正确的浮动4)

有什么我做错了吗?

应该是带帽子的
IBox^
,因为它是接口类型,而不是值类型。例子。另外,您的
T
似乎从
Vector4
更改为
float4
,这似乎不正确。您关于“^”的说法是对的,它们在复制测试代码时丢失了。但这并不能解决问题。Windows::Numerics::float4是ABI::Windows::Numerics::Vector4的C++/CX投影。在C++/CX中使用时,IDL中出现的Vector4实例将映射到float4(而且IBox甚至不编译),因此我希望IReference映射到IBox。嗨,Filippo,你有办法解决这个问题吗?如果你能把你最后做的事情贴出来,也会帮助其他人(包括我)。谢谢对不起,到现在为止运气都不好。