我正在为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)
我有什么问题吗?