Сбой WinRT WRL WinRtClassicComMix и IAsyncOperation

У меня есть компонент 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);
};

И ЦПП:

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 files (x86)\microsoft visual studio 11.0\vc\include\ppltasks.h 5513 1 MyControl

Причина в строке, где create_async присваивается переменной asyncOp auto. Я не могу определить эту переменную явно, так как не могу определить правильный тип. :( Вероятно, это должен быть тип шляпы, но ABI::MyControl::MyComponentColorTable* не может быть объявлен как ^, так как он не определен как класс WinRT, поэтому я предполагаю, что create_async здесь вообще нельзя использовать, но как могу ли я тогда создать и вернуть WinRT IAsyncOperation моего типа? Что нужно для MyComponentColorTable, чтобы его можно было передать обратно через WinRT? И IAvatarComponentColorTable нельзя использовать в качестве возвращаемого типа, поскольку он [исключительно для (AvatarComponentColorTable)]. :(


person Rene Schulte    schedule 19.12.2013    source источник
comment
Взгляните на этот пост: stackoverflow.com/questions/12890841/ Он отвечает на аналогичный вопрос.   -  person Raman Sharma    schedule 12.05.2014
comment
Этот другой вопрос здесь не применяется. Как видите, create_async отлично работает, когда не используется возвращаемый тип.   -  person Rene Schulte    schedule 12.05.2014