OCX、COMコンポーネントのデフォルトイベントIIDの取得

(2001.01.01)
// 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));
}
一覧に戻る
© 2003 WAC.com All Right Reserved.