Здравствуйте, -=chp=-, Вы писали:
C>Заодно можно ли сделать идеологически правильной мою схему с приведениями типов или в морг?
Дык заведи просто внутренний интерфейс и назначь ему приватный — гуид
Что-то типа такого
extern const IID IID_IInternalPageSafe;
MIDL_INTERFACE("0A9CEC92-62B1-47dc-B5A3-E3F0E76E5BD2")
IInternalPageSafe : public IUnknown
{
virtual CXFormObject* GetUnderlayingForm() = 0;
};
// CPage
class ATL_NO_VTABLE CPage :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CPage, &CLSID_Page>,
public IPersistStorageImpl<CPage>,
public IPersistStreamInitImpl<CPage>,
public IPersistPropertyBagImpl<CPage>,
public IDispatchImpl<IPage, &IID_IPage, &LIBID_XFormLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IInternalPageSafe,
public IPropertyNotifySink
{
BEGIN_COM_MAP(CPage)
COM_INTERFACE_ENTRY(IPage)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IInternalPageSafe)
}
// {0A9CEC92-62B1-47dc-B5A3-E3F0E76E5BD2}
static const GUID IID_IInternalPageSafe =
{ 0xa9cec92, 0x62b1, 0x47dc, { 0xb5, 0xa3, 0xe3, 0xf0, 0xe7, 0x6e, 0x5b, 0xd2 } };
Дальше используй обычно через QueryInterface()
CComPtr<IInternalPageSafe> spSafe;
// pPage - объект который реализует скрытый интерфейс
if (FAILED(pPage->QueryInterface(IID_IInternalPageSafe, (void**)&spSafe)))
return E_NOINTERFACE;
... << RSDN@Home 1.1.4 beta 3 rev. 190>>