COMとWinRTが頭の中でごっちゃになっている

公開:2012-06-04 05:49
更新:2020-02-15 04:37
カテゴリ:winrt,c++/cx,windows

「ActivateAudioInterfaceがdeprecateになってしまった」件で、私はIActivateAudioInterfaceAsyncOperationがIAsyncOperationの継承インターフェースかなと思っていたんだけど違っていた。IActivateAudioInterfaceAsyncOperationはレガシーCOMスタイルのインターフェースなので、たとえActivateAudioInterfaceAsync APIの戻り値がこれであってもtaskテンプレートでそのままではハンドルできないのであった。


STDAPI ActivateAudioInterfaceAsync(
    _In_ LPCWSTR deviceInterfacePath,
    _In_ REFIID riid,
    _In_ PROPVARIANT *activationParams,
    _In_ IActivateAudioInterfaceCompletionHandler *completionHandler,
    _COM_Outptr_ IActivateAudioInterfaceAsyncOperation **activationOperation
    );

Audio hardware offload sampleでもコールバックインターフェース(IActivateAudioInterfaceCompletionHandler)を継承したクラスを作って自前で処理しており、taskテンプレートは使用してなかった。コールバックインターフェースは単にIActivateAudioInterfaceCompletionHandlerを継承するだけかと思ったが、サンプルではRuntimeClassテンプレートを介していた。RuntimeClassテンプレートって何?


    // Primary WASAPI Renderering Class
    class WASAPIRenderer :
        public RuntimeClass< RuntimeClassFlags< ClassicCom >, FtmBase, IActivateAudioInterfaceCompletionHandler > 
    {
    public:
        WASAPIRenderer();

新しいAPIだからWinRTみたくtask().then()とか書けるのではないかと思ってたけど甘かった。インターフェース名だけ見ててもそれがWinRT(C++/CX)なのかオールドスタイルCOMなのか判別しずらいし、頭の中でごちゃごちゃになってくる。今一度違いを整理しておかないと。あ、あとRuntimeClassテンプレートがなにかも調べておかないとね。

6/1に見た限りではAPIドキュメントもまだRelease Previewに対応してなかった。Consumer Preview から Release Previewで何が変化したのかすべて列挙した表があればいいんだけど、この様子だとMSさんは作ってくれなさそうだな。。