导航:  COM (Component Object Model) > The making of a type library browser >

Aliases and typedefs

上一页返回章节概述下一页

Some type libraries use aliases and typedefs to give alternate names to data types, enumerations or structures. For example, ADO uses ADO_LONGPTR as a typedef of a LongInteger and SearchDirection as an alias of SearchDirectionEnum.

 

' ----------------------------------------------------------------------------

' Aliases and typedefs

' ----------------------------------------------------------------------------

CASE TKIND_ALIAS

 cbstrName.Clear : cbstrOrigName.Clear : cbstrAliasName.Clear : cbstrAliasName2.Clear : cbstrTypedefName.Clear

 hr = m_pTypeLib->GetDocumentation(i, @cbstrName, NULL, NULL, NULL)

 IF hr = S_OK THEN

    cbstrOrigName = cbstrName

    IF pTypeAttr->tdescAlias.vt = VT_USERDEFINED THEN

       ' // If it is a user defined type, retrieve its name

       hr = pTypeInfo->GetRefTypeInfo(pTypeAttr->tdescAlias.hreftype, @pRefTypeInfo)

       IF hr = S_OK AND pRefTypeInfo <> NULL THEN

          cbstrName.Clear

          hr = pRefTypeInfo->GetDocumentation(-1, @cbstrName, NULL, NULL, NULL)

          IF hr = S_OK THEN

             cbstrAliasName = **cbstrOrigName & " = " & **cbstrName

             cbstrAliasName2 = **cbstrName & " = " & **cbstrOrigName

          END IF

          pRefTypeInfo->Release

          pRefTypeInfo = NULL

       END IF

    ELSEIF pTypeAttr->tdescAlias.vt = VT_PTR THEN

       ' // Pointer to a TYPEDESC structure

       ptdesc = pTypeAttr->tdescAlias.lptdesc

       DO

          SELECT CASE ptdesc->vt

             ' // If it is a pointer, do it again

             CASE VT_PTR

                ptdesc = ptdesc->lptdesc

             CASE VT_USERDEFINED

                ' // Retrieve the name of the user defined type

                hr = pTypeInfo->GetRefTypeInfo(ptdesc->hreftype, @pRefTypeInfo)

                IF hr = S_OK AND pRefTypeInfo <> NULL THEN

                   cbstrName.Clear

                   hr = pRefTypeInfo->GetDocumentation(-1, @cbstrName, NULL, NULL, NULL)

                   IF hr = S_OK THEN

                      cbstrAliasName = **cbstrOrigName & " = " & **cbstrName

                      cbstrAliasName2 = **cbstrName & " = " & **cbstrOrigName

                   END IF

                   pRefTypeInfo->Release

                   pRefTypeInfo = NULL

                END IF

                EXIT DO

             CASE ELSE

                ' // Get the equivalent type

                cbstrTypedefName = cbstrName & " = " & TLB_VarTypeToConstant(ptdesc->vt) & " <" & TLB_VarTypeToKeyword(pTypeAttr->tdescAlias.vt) & ">"

                EXIT DO

          END SELECT

       LOOP

    ELSE

       ' // Get the equivalent type

       cbstrTypedefName = cbstrName & " = " & TLB_VarTypeToKeyword(pTypeAttr->tdescAlias.vt)  & " ' <" & TLB_VarTypeToConstant(pTypeAttr->tdescAlias.vt) & ">"

    END IF

    IF LEN(cbstrTypedefName) THEN

       TreeView_AddItem hTreeView, m_hTypedefsNode, NULL, cbstrTypedefName

    ELSE

       TreeView_AddItem hTreeView, m_hAliasesNode, NULL, cbstrAliasName

    END IF

 END IF

' ----------------------------------------------------------------------------