CComSafeArrayを使って生成した配列を返すCOMのメソッド

CComSafeArrayクラスを使うと、以下のように簡単にSAFEARRAY構造体を簡単に扱うことができる。

STDMETHODIMP CHoge::get_Array(VARIANT* pVal)
{
    VariantInit(pVal);
    pVal->vt = VT_ARRAY | VT_BSTR;

    CComSafeArray<BSTR> psa;
    psa.Add(ComBSTR("hoge"));
    psa.Add(ComBSTR("fuga"));
    psa.Add(ComBSTR("moge"));
    pVal->parray = psa.Detach();

    retern S_OK;
}

最後のほうの、psa.Detach()がミソらしい。
こうしないと、この関数から受け取った配列にアクセスしようとしたとき”ロックされている”とかなんとかエラーが出てしまう。