HRESULT GetHelpContext([out] DWORD * pdwHelpContext);

}

Специальные объекты исключений могут выбрать другие специфические для исключений интерфейсы в дополнение к IErrorInfo.

СОМ предусматривает по умолчанию реализацию IErrorInfo, которую можно создать с использованием API-функции СОМ CreateErrorInfo:

HRESULT CreateErrorInfo([out] ICreateErrorInfo **ppcei);

В дополнение к IErrorInfo объекты исключений по умолчанию открывают интерфейс ICreateErrorInfo, чтобы позволить пользователю инициализировать состояние нового исключения:

[ object, uuid(22F03340-547D-101B-8E65-08002B2BD119) ]

interface ICreateErrorInfo: IUnknown

{

// set IID of interface that threw exception

// устанавливаем IID интерфейс, который возбудил исключение

HRESULT SetGUID([in] REFGUID rGUID);

// set class name of object that threw exception

// устанавливаем классовое имя объекта, который возбудил исключение

HRESULT SetSource([in, string] OLECHAR* pwszSource);

// set human-readable description of exception

// устанавливаем читабельное описание исключения

HRESULT SetDescription([in, string] OLECHAR* pwszDesc);

// set WinHelp filename of documentation of error

// устанавливаем имя файла WinHelp, содержащего документацию об ошибке

HRESULT SetHelpFile([in, string] OLECHAR* pwszHelpFile);

// set WinHelp context ID for documentation of error

// устанавливаем идентификатор контекста WinHelp для документации ошибки

HRESULT SetHelpContext([in] DWORD dwHelpContext);

}

Заметим, что этот интерфейс просто позволяет пользователю заполнить объект исключения пятью основными атрибутами, доступными из интерфейса IErrorInfo.

Следующая реализация метода выбрасывает СОМ-исключение своему вызывающему объекту, используя объект исключений по умолчанию:

STDMETHODIMP PugCat::Snore(void)

{

if (this->IsAsleep())

// ok to perform operation?

// можно ли выполнять операцию?

return this->DoSnore();

//do operation and return

// выполняем операцию и возвращаемся

//otherwise create an exception object

// в противном случае создаем объект исключений

ICreateErrorInfo *рсеi = 0; HRESULT hr = CreateErrorInfo(&pcei);

assert(SUCCEEDED(hr));

// initialize the exception object

// инициализируем объект исключений

hr = pcei->SetGUID(IIDIPug);

assert(SUCCEEDED(hr));

hr = pcei->SetSource(OLESTR(«PugCat»));

assert(SUCCEEDED(hr));

hr = pcei->SetDescription(OLESTR('I am not asleep!'));

assert(SUCCEEDED(hr));

hr = pcei->SetHelpFile(OLESTR(«C:\PugCat.hlp»));

assert(SUCCEEDED(hr));

hr = pcei->SetHelpContext(5221);

assert(SUCCEEDED(hr));

// «throw» exception

// «выбрасываем» исключение

IErrorInfo *pei = 0;

hr = pcei->QueryInterface(IIDIErrorInfo, (void**)&pei);

assert(SUCCEEDED(hr));

hr = SetErrorInfo(0, pei);

// release resources and return a SEVERITYERROR result

// высвобождаем ресурсы и возвращаем результат

// SEVERITYERROR (серьезность ошибки)

pei->Release();

pcei->Release();

return PUGEPUGNOTASLEEP;

}

Отметим, что поскольку объект исключений передается в процедуру SetErrorInfo, СОМ сохраняет ссылку на исключение до тех пор, пока оно не будет «перехвачено» вызывающим объектом, использующим GetErrorInfo.

Объекты, которые сбрасывают исключения СОМ, должны использовать интерфейс ISupportErrorInfo , чтобы показывать, какие интерфейсы поддерживают исключения. Этот интерфейс используется клиентами, чтобы установить, верный ли результат дает GetErrorInfo[2]. Этот интерфейс предельно прост:

[ object, uuid(DFOB3060-548F-101B-8E65-08002B2BD119) ]

interface ISupportErrorInfo: IUnknown

{

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату