Основанный на приведенной выше реализации Advise соответствующий метод Unadvise имеет следующий вид:
STDMETHODIMP Surfboard::XCPShutdownNotify::Unadvise(DWORD dwCookie)
{
// ensure that the cookie corresponds to a valid connection
// убеждаемся, что маркер соответствует допустимому соединению
if (DWORD (This()->m_pShutdownNotify) != dwCookie)
return CONNECT_E_NOCONNECTION;
// release the connection
// освобождаем соединение
This()->m_pShutdownNotify->Release();
This()->m_pShutdownNotify = 0;
return S_OK;
}
В интерфейсе IConnectionPoint имеется три дополнительных вспомогательных метода, два из которых реализуются тривиально:
STDMETHODIMP Surfboard::XCPShutdownNotify::GetConnectionInterface( IID *piid)
{
assert (piid);
// return IID of the interface managed by this subobject
// возвращаем IID интерфейса, управляемого этим подобъектом
*piid = IID_IShutdownNofify;
return S_OK;
}
STDMETHODIMP Surfboard::XCPShutdownNotify::GetConnectionPointContainer(
IConnectionPointContainer **ppcpc)
{
assert(ppcpc);
(*ppcpc = This())->AddRef();
// return containing object
// возвращаем объект-контейнер
return S_OK;
}
Последний из этих трех методов, EnumConnections, позволяет вызывающим программам перенумеровывать соединенные интерфейсы. Данный метод является дополнительным, так что реализации могут законно возвращать E_NOTIMPL.
Для объявления о том, какие из экспортируемых интерфейсов класс реализации поддерживает, в IDL предусмотрен атрибут [source]:
[uuid(315BC280-DEA7-11d0-8C5E-0080C73925BA) ]
coclass Surfboard {
[default] interface ISurfboard;
interface IHazardousDevice;
interface ISharkBait;
[source] interface IShutdownNotify;
[source, default] interface ISurfboardUser;
}
Кроме этого, в СОМ предусмотрено два интерфейса, которые позволяют средам этапа выполнения запрашивать объект самостоятельно (introspectively) возвращать информацию об импортируемых в него и экспортируемых им типах интерфейсов:
[object,uuid(B196B283-BAB4-101A-B69C-00AA00341D07) ]
interface IProvideClassInfo : Unknown {
// return description of object's coclass
// возвращаем описание кокласса объекта
HRESULT GetClassInfo([out] ITypeInfo ** ppTI);
}
[object, uuid(A6BC3AC0-DBAA-11CE-9DE3-00M004BB851) ]
interface IProvideClassInfo2 : IProvideClassInfo {
typedef enum tagGUIDKIND {
GUIDKIND_DEFAULT_SOURCE_DISP_IID = 1
} GUIDKIND;
|< Пред. 484 485 486 487 488 След. >|