为本机C ++类编写C ++ / CX包装类

时间:2013-01-23 17:43:06

标签: c++ windows-8 windows-runtime c++-cx

由于C ++ / CX类不允许在公共签名中使用本机类型,我需要找到一种获取信息的替代方法。我发现了一些在Internet上编写包装类的引用,但没有实际实施。如何在我的代码中启用以下方案?

public ref class MyRefClass
{
public:
    void SetNativeType(NativeType *pType);
};

显然这不起作用,所以如何包装NativeType以便将其传递到MyRefClass

我应该补充说,这是在一个单独的库中,因此使用internal关键字对此无效。

2 个答案:

答案 0 :(得分:1)

假设只是将指针包装到NativeType就足够了,可以使用Platform::IntPtr作为“通用”参数。

来自MSDN:

static IntPtr::operator IntPtr( void* value1);
static IntPtr::operator IntPtr( int value2);
static IntPtr::operator void*( IntPtr value3 );

作为替代方案,您可以将SetNativeType(NativeType *pType);作为内部,然后使用头文件而不是Windows Store类库分发静态库。

关于the warning you mentioned in your comments,您可以尝试使用普通的C ++类MyPlainClass,并将其实现导出到lib文件中(即使您在其中使用其他ref类),然后提供仅限标头的引用类MyRefClass,包装MyPlainClass并充当公共接口。这个解决方案也不完美,我猜你会在同一个项目中组合两个使用你的lib +头文件的winrt库,但也许你不需要支持这个场景。

答案 1 :(得分:0)

由于WinRT(和COM)解决了二进制API兼容性的真正问题,我个人决定使用COM。您可以声明没有IDL或类型库的私有接口。您只需要在客户端中包含带有接口声明的标头。您只需要匹配的IID和接口签名(除了还要弄清楚如何传递IUnknown指针)。