А> Есть такой код:

А>    SAFEARRAY * pSa = SafeArrayCreate(VT_BSTR, 1, rgsabound);
А>...
А>    VARIANT var;
А>...
А>    var.vt = VT_ARRAY | VT_BSTR;
А>    var.parray = pSa;
А>...
А>    SafeArrayDestroy(pSa);
А>    VariantClear(&var);

А> Феня в том, что после выполнения данного кода программа падает.

Вот смотри. Есть две переменные pSa и var, которые ссылаются на один и тот же массив. Есть одно место создания (SafeArrayCreate), значит, должно быть одно место удаления. Логично, если это будет SafeArrayDestroy.

Однако, VARIANT — такая штука, которая требует монопольного владения своим содержимым (это на случай реальной работы с ним — копирование в него, освобождение, передача в другое место программы и пр.). Поэтому я бы посоветовал рассматривать pSa как синоним var.parray и использовать VariantClear (и убрать SafeArrayDestroy).
Автор: Vi2    Оценить