У меня есть вопрос о том, когда необходимо использовать SafeArrayAccessData для блокировки SAFEARRAY, который передается управляемым кодом.
Вот наш код. VARIANT передается управляемым кодом со строковым массивом. Во время проверки кода кто-то предлагает использовать SafeArrayAccessData / SafeArrayUnAccessData. Но он не уверен, почему и в чем выгода. Можете ли вы поделиться своим опытом? Спасибо!
STDMETHODIMP Base::Method1(VARIANT values, VARIANT_BOOL result)
{
CComSafeArray<BSTR> ids;
ids.Attach(values.parray);
unsigned int size = ids.GetCount();
for(unsigned int i = 0; i < size; ++i)
{
// use ids[i] here
}
// ...
}
Ну, всегда 🙂 Вам нужно получить ссылку на содержимое массива.
Но вы используете дружественный класс оболочки C ++. CComSafeArray<> Шаблон уже делает это для вас, поэтому вы не должны помогать. Он использует SafeArrayLock () в методе Attach (), который также возвращает указатель на содержимое массива, как это делает SafeArrayAccessData (). И автоматически разблокируется деструктором, он запускается в конце вашего метода. В противном случае блокировка гарантирует, что доступ к массиву является потокобезопасным и не может быть удален при обращении к нему. В вашем существующем коде такой опасности мало, но это полностью соответствует принципам автоматизации «лучше, чем безопасно».
Других решений пока нет …