// mfc\src\OCCSITE.CPP(674)よりコピー
#define IMPLTYPE_MASK \
(IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE | IMPLTYPEFLAG_FRESTRICTED)
#define IMPLTYPE_DEFAULTSOURCE \
(IMPLTYPEFLAG_FDEFAULT | IMPLTYPEFLAG_FSOURCE)
BOOL GetEventIID(LPUNKNOWN punkSource, IID* piid)
{
ASSERT(punkSource);
ASSERT(piid);
*piid = GUID_NULL;
ASSERT(punkSource != NULL);
// Use IProvideClassInfo2, if control supports it.
LPPROVIDECLASSINFO2 pPCI2 = NULL;
if (SUCCEEDED(punkSource->QueryInterface(IID_IProvideClassInfo2,
(LPVOID*)&pPCI2)))
{
ASSERT(pPCI2 != NULL);
if (SUCCEEDED(pPCI2->GetGUID(GUIDKIND_DEFAULT_SOURCE_DISP_IID, piid)))
ASSERT(!IsEqualIID(*piid, GUID_NULL));
else
ASSERT(IsEqualIID(*piid, GUID_NULL));
pPCI2->Release();
}
// Fall back on IProvideClassInfo, if IProvideClassInfo2 not supported.
LPPROVIDECLASSINFO pPCI = NULL;
if (IsEqualIID(*piid, GUID_NULL) &&
SUCCEEDED(punkSource->QueryInterface(IID_IProvideClassInfo,
(LPVOID*)&pPCI)))
{
ASSERT(pPCI != NULL);
LPTYPEINFO pClassInfo = NULL;
if (SUCCEEDED(pPCI->GetClassInfo(&pClassInfo)))
{
ASSERT(pClassInfo != NULL);
LPTYPEATTR pClassAttr;
if (SUCCEEDED(pClassInfo->GetTypeAttr(&pClassAttr)))
{
ASSERT(pClassAttr != NULL);
ASSERT(pClassAttr->typekind == TKIND_COCLASS);
// Search for typeinfo of the default events interface.
int nFlags;
HREFTYPE hRefType;
for (unsigned int i = 0; i < pClassAttr->cImplTypes; i++)
{
if (SUCCEEDED(pClassInfo->GetImplTypeFlags(i, &nFlags)) &&
((nFlags & IMPLTYPE_MASK) == IMPLTYPE_DEFAULTSOURCE))
{
// Found it. Now look at its attributes to get IID.
LPTYPEINFO pEventInfo = NULL;
if (SUCCEEDED(pClassInfo->GetRefTypeOfImplType(i, &hRefType)) &&
SUCCEEDED(pClassInfo->GetRefTypeInfo(hRefType &pEventInfo)))
{
ASSERT(pEventInfo != NULL);
LPTYPEATTR pEventAttr;
if (SUCCEEDED(pEventInfo->GetTypeAttr(&pEventAttr)))
{
ASSERT(pEventAttr != NULL);
*piid = pEventAttr->guid;
pEventInfo->ReleaseTypeAttr(pEventAttr);
}
pEventInfo->Release();
}
break;
}
}
pClassInfo->ReleaseTypeAttr(pClassAttr);
}
pClassInfo->Release();
}
pPCI->Release();
}
return (!IsEqualIID(*piid, GUID_NULL));
}