Реализация ISupportErrorInfo - что это означает?

grep -E \abc log.txt | awk '{print length($1) " " $1}' | sort -n |  tail -1 | awk '{print $2}'

Идея: найти длину, отсортировать по числу, а затем из последней строки вывести только 2-й элемент.

11
задан 1800 INFORMATION 6 October 2008 в 01:04
поделиться

1 ответ

Мое понимание его (на основе некоторых связанных страниц MSDN) является этим путем реализации ISupportErrorInfo, Вы указываете, что один или несколько интерфейсов на Вашем классе возвращают информацию об ошибке путем вызова SetErrorInfo, в противоположность просто возврату отказа HRESULT.

С этой целью, Ваша реализация ISuportErrorInfo::InterfaceSupportsErrorInfo должен возвратиться S_OK только для тех интерфейсов на Вашем классе это на самом деле использует SetErrorInfo возвратить информацию об ошибке вызывающей стороне и только те интерфейсы.

Например, скажите, что у Вас есть класс, который реализует интерфейс, который Вы записали названный IFoo это имеет a DoSomething метод. Если кто-то еще создает экземпляр Вашего класса и вызовов IFoo::DoSomething, они, как предполагается, делают следующее если DoSomething возвращает отказ HRESULT (перефразирующий от различных страниц MSDN, но я запустил отсюда: http://msdn.microsoft.com/en-us/library/ms221510.aspx):

  • Звонить QueryInterface на IFoo указатель для получения ISupportErrorInfo интерфейс для объекта, который реализует IFoo

  • Если названный объект не реализует ISupportErrorInfo, затем вызывающая сторона должна будет обработать ошибку на основе HRESULT значение или передача это стек вызовов.

  • Если названный объект действительно реализует ISupportErrorInfo, затем вызывающая сторона должна звонить ISupportErrorInfo::InterfaceSupportsErrorInfo, передача в a REFIID для интерфейса, который возвратил ошибку. В этом случае, DoSomething метод IFoo интерфейс возвратил ошибку, таким образом, Вы передадите REFIID_IFoo (принятие это определяется) к InterfaceSupportsErrorInfo.

  • Если InterfaceSupportsErrorInfo возвраты S_OK, затем вызывающая сторона знает в этой точке, что она может получить более подробную информацию об ошибке путем вызова GetErrorInfo. Если InterfaceSupportsErrorInfo возвраты S_FALSE, вызывающая сторона может предположить, что названный интерфейс не предоставляет подробную ошибочную информацию и должен будет полагаться на возвращенный HRESULT для выяснения то, что произошло.

Причина этой несколько запутывающей/замысловатой обработки ошибок, которая API, кажется, для гибкости (как далеко я, как я могу сказать так или иначе. Это - COM, в конце концов, ;). С этим дизайном класс может поддерживать несколько интерфейсов, но не каждый интерфейс требуется, чтобы использовать SetErrorInfo возвратить информацию об ошибке из ее методов. У Вас могут быть определенные, избранные интерфейсы на подробной информации об ошибке возврата Вашего класса через SetErrorInfo, в то время как другие интерфейсы могут продолжить использовать нормальный HRESULTs для указания на ошибки.

Таким образом, ISupportErrorInfo интерфейс является способом сообщить коду вызова, что по крайней мере один из интерфейсов Ваши реализации класса может возвратить подробную информацию об ошибке, и InterfaceSupportsErrorInfo метод говорит вызывающей стороне, является ли данный интерфейс одним из тех интерфейсов. Если так, затем вызывающая сторона может получить подробную информацию об ошибке путем вызова GetErrorInfo.

19
ответ дан 3 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: