2015-03-05 4 views
0

Я знаю, что SafeArrayAccessData также блокирует/разблокирует, но неважно, что мне интересно только знать, возвращает ли он указатель, отличный от pvData.Сохраняет ли SafeArrayAccessData указатель, отличный от pvData?

Например, этот код не вызывает Assert (что я мог видеть в моих тестах):

SafeArrayAccessData(sa, (void**) &ptr); 
assert(ptr == sa->pvData); 

Кто-нибудь знает о сценарии, где SafeArrayAccessData даст указатель, который не равен pvData?

ответ

2

Единственный способ указатель из-параметр установлен SafeArrayAccessData() бы быть иным, чем psa->pvData бы, если возвращаемое значение функции является исключением S_OK (например, массив не может быть заблокирован, в этом случае значение затраченной параметра не определен).

Если функция возвращает S_OK, указатель out-parameter должен быть равен psa->pvData (в конце концов, что еще это может быть?).

+0

Я спрашивал, потому что уже есть SafeArrayLock/SafeArrayUnlock, что делает избыточность SafeArrayAccessData/SafeArrayUnaccessData, поэтому я подумал, что, возможно, я что-то упустил. – sashoalm

+0

Я вижу. Хорошо, обратите внимание на документы для функции Lock: «* Увеличивает количество блокировок массива и помещает указатель на данные массива в pvData дескриптора массива.» «Так что если вы вообще не заблокируете, pvData может не допустимо, я полагаю. Но в случае использования у вас есть, я не думаю, что важно, какую функцию вы используете - это просто вопрос удобства/стиля. –