Недавно начали изучать COM. В COM возвращаемый тип функций должен быть HRESULT. Читайте о HRESULT
, проблемах с GetLastError()
, но тогда почему, функции IUnknown, AddRef()
и Release()
имеют тип возврата ULONG
?Зачем возвращать тип AddRef() и Release() не является HRESULT
Я пришел с ответом, что AddRef()
(почти) всегда звонил из QueryInterface()
, и клиент не должен его называть. И для Release()
его возвращаемое значение никогда не проверяется.
Хотя я могу спорить с собственными ответами - для AddRef()
- Возможно, для клиента это может быть ситуация, когда он должен позвонить. И поскольку клиент имеет доступ к этой функции, какова гарантия того, что клиент ее не назовет.
для Release()
- Опять же, пользователь может проверить тип возвращаемого значения, потому что он МОЖЕТ
Просьба уточнить.
Также это похоже -> Его конвенция имеет тип возврата HRESULT для функций, связанных с COM, а не принуждение -> Если это правда, это остановит путаницу в моем мозгу.
'AddRef' и' Release' никогда не сбой, поэтому нет смысла возвращать им 'HRESULT'. Что касается вашего последнего вопроса: ['[local]'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa367071.aspx) методы не должны возвращать 'HRESULT' (хотя они если они захотят); все другие методы должны возвращать 'HRESULT'. Это связано с тем, что слой маршалинга должен иметь возможность сообщать о своих собственных ошибках (например, сбой сети, если вызов пересекает границы машины и удаленный хост недоступен). 'AddRef' и' Release' являются '[local]' –
Если нет необходимости в статусе успеха/отказа (см. Выше), возвращаемое значение повторно используется для чего-то полезного, которое является индикатором счетчика ссылок. Это делает эти очень часто используемые методы легкими и эффективными. –
@IgorTandetnik Спасибо за ответ. Хотя, я все еще думаю, что клиенту, возможно, потребуется вызвать 'AddRef()'. Напр. предположим, что клиент имеет указатель на локальный интерфейс, который будет назначен верным указателем интерфейса, возвращаемым сервером. И если оба клиента и сервер - два разных процесса, их адресные пространства также будут разными. Поэтому, если 'pIOne' отправляется сервером и' pIOneTemp' является локальным, то после оператора 'pIOneTemp = pIOne;' клиент должен будет вызвать 'AddRef()' на 'pIOneTemp', просто потому, что он находится в совершенно другом адресном пространстве , Теперь почему он не должен возвращать 'HRESULT'? – user2705939