Я новый член команды и читаю код ниже. Интересно, нужно ли вызывать SafeArrayUnLock в докторе? Я пытался искать в Интернете без четкой подсказки. Так что очень ценю вашу помощь!
Код:
class Trasaction
{
private:
CComSafeArray m_saCache;
public:
//ctor
Transaction(CComQIPtr<Reader>& pReader)
{
//This call need a SAFEARRAY** as its 3rd parameter
pReader->ReadData(start, size, &m_saCache);
SafeArrayLock(m_saCache.m_psa);
}
};
Поскольку вы держите объект SAFEARRAY через класс CComSafeArray (RIIA), который сохраняет SafeArray в заблокированном состоянии, и когда вы изменяете указатель напрямую, а не вызываете метод Attach, вы должны явно вызывать SafeArrayLock. Но вам не нужно вызывать unLock в деструкторе, потому что деструктор CComSafeArray будет делать Unlock.
Чтобы в будущем не возникало новых сомнений в отношении ложного вызова SafeArrayLock и отсутствующего SafeArrayUnLock, я предлагаю использовать метод Attach в CComSafeArray, сначала взяв возвращаемое значение в виде простого SAFEARRAY *.
Других решений пока нет …