2014-01-22 4 views
3

Недавно начали изучать COM. В COM возвращаемый тип функций должен быть HRESULT. Читайте о HRESULT, проблемах с GetLastError(), но тогда почему, функции IUnknown, AddRef() и Release() имеют тип возврата ULONG?Зачем возвращать тип AddRef() и Release() не является HRESULT

Я пришел с ответом, что AddRef() (почти) всегда звонил из QueryInterface(), и клиент не должен его называть. И для Release() его возвращаемое значение никогда не проверяется.

Хотя я могу спорить с собственными ответами - для AddRef() - Возможно, для клиента это может быть ситуация, когда он должен позвонить. И поскольку клиент имеет доступ к этой функции, какова гарантия того, что клиент ее не назовет.

для Release() - Опять же, пользователь может проверить тип возвращаемого значения, потому что он МОЖЕТ

Просьба уточнить.

Также это похоже -> Его конвенция имеет тип возврата HRESULT для функций, связанных с COM, а не принуждение -> Если это правда, это остановит путаницу в моем мозгу.

+2

'AddRef' и' Release' никогда не сбой, поэтому нет смысла возвращать им 'HRESULT'. Что касается вашего последнего вопроса: ['[local]'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa367071.aspx) методы не должны возвращать 'HRESULT' (хотя они если они захотят); все другие методы должны возвращать 'HRESULT'. Это связано с тем, что слой маршалинга должен иметь возможность сообщать о своих собственных ошибках (например, сбой сети, если вызов пересекает границы машины и удаленный хост недоступен). 'AddRef' и' Release' являются '[local]' –

+0

Если нет необходимости в статусе успеха/отказа (см. Выше), возвращаемое значение повторно используется для чего-то полезного, которое является индикатором счетчика ссылок. Это делает эти очень часто используемые методы легкими и эффективными. –

+0

@IgorTandetnik Спасибо за ответ. Хотя, я все еще думаю, что клиенту, возможно, потребуется вызвать 'AddRef()'. Напр. предположим, что клиент имеет указатель на локальный интерфейс, который будет назначен верным указателем интерфейса, возвращаемым сервером. И если оба клиента и сервер - два разных процесса, их адресные пространства также будут разными. Поэтому, если 'pIOne' отправляется сервером и' pIOneTemp' является локальным, то после оператора 'pIOneTemp = pIOne;' клиент должен будет вызвать 'AddRef()' на 'pIOneTemp', просто потому, что он находится в совершенно другом адресном пространстве , Теперь почему он не должен возвращать 'HRESULT'? – user2705939

ответ

0

«AddRef и Release не могут никогда не срабатывать, поэтому нет смысла иметь их return HRESULT». -Igor Tandetnik

Я отправляю это как ответ только потому, что мои глаза кровотечение из дочитать этот вопрос и все комментарии в надежде помочь кому-то ... прийти на SO сообщества, позволяет получить эти типы вопросы закрыты. Было бы намного легче помогать людям, не обойдя весь этот мусор.