我有一个 C++ WinRT 组件,它是一个 WinRtClassicComMix。我想定义一个方法,该方法通过 IAsyncOperation 将自定义类返回到调用 C# 或 WinJS 代码。当使用没有返回值的 IAsyncAction 时一切正常,但是使用带有自动返回值的 PPL 的 create_async 会使 VS 2012 和 VS 2013 编译器崩溃。
相关细节:
接口和类在 IDL 中定义:
namespace MyControl
{
runtimeclass MyComponentColorTable;
[version(MyS_VERSION)]
[uuid(7BB5A348-C82C-4EC4-946F-5113843A6A83)]
[exclusiveto(MyComponentColorTable)]
interface IMyComponentColorTable: IInspectable
{
[propget] HRESULT Count([out, retval] unsigned long *value);
HRESULT GetAt([in] unsigned long index, [out, retval] ComponentColor *componentColor);
}
[version(MyS_VERSION)]
[activatable(MyS_VERSION)]
[marshaling_behavior(agile)]
[threading(both)]
runtimeclass MyComponentColorTable
{
[default] interface IMyComponentColorTable;
}
runtimeclass MyRendererScene;
[version(MyS_VERSION)]
[uuid(8D51F7F2-EDCF-4ED4-B556-03D3CC390A83)]
[exclusiveto(MyRendererScene)]
interface IMyRendererScene: IInspectable
{
HRESULT GetComponentColorTableAsync([in] GUID assetId, [out, retval] Windows.Foundation.IAsyncOperation<MyControl.MyComponentColorTable*>** operation);
}
}
对应的头文件:
class CMyRendererScene :
public Microsoft::WRL::RuntimeClass
<
RuntimeClassFlags<Microsoft::WRL::WinRtClassicComMix>,
IMyRendererScene
>
{
InspectableClass(RuntimeClass_MyControl_MyRendererScene, BaseTrust);
public:
CMyRendererScene(void);
~CMyRendererScene(void);
IFACEMETHOD(GetComponentColorTableAsync)(GUID assetId, ABI::Windows::Foundation::IAsyncOperation<ABI::MyControl::MyComponentColorTable*>** operation);
};
和 CPP:
IFACEMETHODIMP CMyRendererScene::GetComponentColorTableAsync(GUID assetId, ABI::Windows::Foundation::IAsyncOperation<ABI::MyControl::MyComponentColorTable*>** operation)
{
Concurrency::task_completion_event<ABI::MyControl::MyComponentColorTable*> tce;
auto tsk = Concurrency::create_task(tce);
auto asyncOp = Concurrency::create_async( [tsk]() -> Concurrency::task<ABI::MyControl::MyComponentColorTable*>
{
return tsk;
});
// ... Wrapping of the event-based model using task_completion_event happens here ...
return S_OK;
}
编译失败并导致 VS C++ 编译器崩溃:
错误 1 错误 C1001:编译器发生内部错误。c:\program 文件 (x86)\microsoft visual studio 11.0\vc\include\ppltasks.h 5513 1 MyControl
原因是将 create_async 分配给 asyncOp 自动变量的行。我无法明确定义该变量,因为我无法确定正确的类型。:( 它可能需要是帽子类型,但是 ABI::MyControl::MyComponentColorTable* 不能声明为 ^ 因为它没有定义为 WinRT 类,所以我假设 create_async 在这里根本不能使用,但是如何那么我可以创建并返回我的类型的 WinRT IAsyncOperation 吗?MyComponentColorTable 需要什么才能通过 WinRT 传回?IAvatarComponentColorTable 不能用作返回类型,因为它是 [exclusiveto(AvatarComponentColorTable)]。:(