grep -E \abc log.txt | awk '{print length($1) " " $1}' | sort -n | tail -1 | awk '{print $2}'
Идея: найти длину, отсортировать по числу, а затем из последней строки вывести только 2-й элемент.
Мое понимание его (на основе некоторых связанных страниц 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
, в то время как другие интерфейсы могут продолжить использовать нормальный HRESULT
s для указания на ошибки.
Таким образом, ISupportErrorInfo
интерфейс является способом сообщить коду вызова, что по крайней мере один из интерфейсов Ваши реализации класса может возвратить подробную информацию об ошибке, и InterfaceSupportsErrorInfo
метод говорит вызывающей стороне, является ли данный интерфейс одним из тех интерфейсов. Если так, затем вызывающая сторона может получить подробную информацию об ошибке путем вызова GetErrorInfo
.