Como um retorna um CComSafeArray local para um parâmetro de saída LPSAFEARRAY?

Eu tenho uma função COM que deve retornar um SafeArray através de umLPSAFEARRAY* parâmetro out. A função cria o SafeArray usando ATLsCComSafeArray classe de modelo. Minha implementação ingênua usaCComSafeArray<T>::Detach() para mover a propriedade da variável local para o parâmetro de saída:

void foo(LPSAFEARRAY* psa)
{
    CComSafeArray<VARIANT> ret;
    ret.Add(CComVariant(42));
    *psa = ret.Detach();
}

int main()
{
    CComSafeArray<VARIANT> sa;
    foo(sa.GetSafeArrayPtr());

    std::cout << sa[0].lVal << std::endl;
}

O problema é queCComSafeArray::Detach() executa umUnlock operação de modo que quando o novo proprietário do SafeArray (main'ssa neste caso) é destruído o bloqueio não é zero eDestroy falha ao desbloquear o SafeArray comE_UNEXPECTED (isso leva a um vazamento de memória, pois o SafeArray não é desalocado).

Qual é a maneira correta de transferir a propriedade entre para CComSafeArrays através de um limite de método COM?

Editar: A partir da única resposta, parece que o erro está no lado do cliente (main) e não do lado do servidor (foo), mas acho difícil acreditarCComSafeArray não foi projetado para este caso de uso trivial, deve haver uma maneira elegante de obter um SafeArray de um método COM em umCComSafeArray.

questionAnswers(3)

yourAnswerToTheQuestion