oleview: Added more fields to TypeLib Viewer tree

Piotr Caban piotr.caban at gmail.com
Mon Jul 10 05:07:51 CDT 2006


Hi,

Changelog:
 - Added more fields to TypeLib Viewer tree

 programs/oleview/En.rc      |    1
 programs/oleview/resource.h |    1
 programs/oleview/typelib.c  |  170
+++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 165 insertions(+), 7 deletions(-)

--
Piotr

-------------- next part --------------
diff --git a/programs/oleview/En.rc b/programs/oleview/En.rc
index dfb09aa..f3bd451 100644
--- a/programs/oleview/En.rc
+++ b/programs/oleview/En.rc
@@ -143,6 +143,7 @@ STRINGTABLE
     IDS_BYTES,             "bytes"
 
     IDS_ERROR_LOADTYPELIB, "LoadTypeLib( %s ) failed ($%x)"
+    IDS_INHERITINTERFACES, "Inherited Interfaces"
 }
 
 DLG_CREATEINSTON DIALOG DISCARDABLE 0, 0, 250, 41
diff --git a/programs/oleview/resource.h b/programs/oleview/resource.h
index 73cde3d..7ff5a11 100644
--- a/programs/oleview/resource.h
+++ b/programs/oleview/resource.h
@@ -76,6 +76,7 @@ #define IDS_FALSE                  311
 #define IDS_BYTES                  312
 
 #define IDS_ERROR_LOADTYPELIB      400
+#define IDS_INHERITINTERFACES      401
 
 #define DLG_CREATEINSTON           1000
 #define IDC_MACHINE                1001
diff --git a/programs/oleview/typelib.c b/programs/oleview/typelib.c
index 1875992..9eab7c4 100644
--- a/programs/oleview/typelib.c
+++ b/programs/oleview/typelib.c
@@ -35,24 +35,40 @@ static const WCHAR wszVT_BOOL[]
     = { 'V','A','R','I','A','N','T','_','B','O','O','L','\0' };
 static const WCHAR wszVT_UI1[]
     = { 'u','n','s','i','g','n','e','d',' ','c','h','a','r','\0' };
+static const WCHAR wszVT_UI2[]
+    = { 'u','n','s','i','g','n','e','d',' ','s','h','o','r','t','\0' };
 static const WCHAR wszVT_UI4[]
     = { 'u','n','s','i','g','n','e','d',' ','l','o','n','g','\0' };
+static const WCHAR wszVT_UI8[] = { 'u','i','n','t','6','4','\0' };
+static const WCHAR wszVT_UINT[]
+    = { 'u','n','s','i','g','n','e','d',' ','i','n','t','\0' };
+static const WCHAR wszVT_I1[] = { 'c','h','a','r','\0' };
+static const WCHAR wszVT_I2[] = { 's','h','o','r','t','\0' };
 static const WCHAR wszVT_I4[] = { 'l','o','n','g','\0' };
+static const WCHAR wszVT_I8[] = { 'i','n','t','6','4','\0' };
 static const WCHAR wszVT_R4[] = { 's','i','n','g','l','e','\0' };
 static const WCHAR wszVT_INT[] = { 'i','n','t','\0' };
 static const WCHAR wszVT_BSTR[] = { 'B','S','T','R','\0' };
 static const WCHAR wszVT_CY[] = { 'C','U','R','R','E','N','C','Y','\0' };
+static const WCHAR wszVT_VARIANT[] = { 'V','A','R','I','A','N','T','\0' };
+static const WCHAR wszVT_VOID[] = { 'v','o','i','d','\0' };
+static const WCHAR wszVT_ERROR[] = { 'S','C','O','D','E','\0' };
+static const WCHAR wszVT_LPSTR[] = { 'L','P','S','T','R','\0' };
+static const WCHAR wszVT_LPWSTR[] = { 'L','P','W','S','T','R','\0' };
 
 void AddToStrW(WCHAR *wszDest, const WCHAR *wszSource)
 {
     lstrcpyW(&wszDest[lstrlenW(wszDest)], wszSource);
 }
 
-void CreateTypeInfo(WCHAR *wszAddTo, TYPEDESC tdesc, ITypeInfo *pTypeInfo)
+void CreateTypeInfo(WCHAR *wszAddTo, WCHAR *wszAddAfter, TYPEDESC tdesc, ITypeInfo *pTypeInfo)
 {
+    int i;
     BSTR bstrData;
     HRESULT hRes;
     ITypeInfo *pRefTypeInfo;
+    WCHAR wszBuf[MAX_LOAD_STRING];
+    WCHAR wszFormat[] = { '[','%','l','u',']','\0' };
 
     switch(tdesc.vt&VT_TYPEMASK)
     {
@@ -61,14 +77,33 @@ #define VTADDTOSTR(x) case x:\
         break
         VTADDTOSTR(VT_BOOL);
         VTADDTOSTR(VT_UI1);
+        VTADDTOSTR(VT_UI2);
         VTADDTOSTR(VT_UI4);
+        VTADDTOSTR(VT_UI8);
+        VTADDTOSTR(VT_UINT);
+        VTADDTOSTR(VT_I1);
+        VTADDTOSTR(VT_I2);
         VTADDTOSTR(VT_I4);
+        VTADDTOSTR(VT_I8);
         VTADDTOSTR(VT_R4);
         VTADDTOSTR(VT_INT);
         VTADDTOSTR(VT_BSTR);
         VTADDTOSTR(VT_CY);
+        VTADDTOSTR(VT_VARIANT);
+        VTADDTOSTR(VT_VOID);
+        VTADDTOSTR(VT_ERROR);
+        VTADDTOSTR(VT_LPSTR);
+        VTADDTOSTR(VT_LPWSTR);
+        case VT_CARRAY:
+        for(i=0; i<U(tdesc).lpadesc->cDims; i++)
+        {
+            wsprintfW(wszBuf, wszFormat, U(tdesc).lpadesc->rgbounds[i].cElements);
+            AddToStrW(wszAddAfter, wszBuf);
+        }
+        CreateTypeInfo(wszAddTo, wszAddAfter, U(tdesc).lpadesc->tdescElem, pTypeInfo);
+        break;
         case VT_PTR:
-        CreateTypeInfo(wszAddTo, *U(tdesc).lptdesc, pTypeInfo);
+        CreateTypeInfo(wszAddTo, wszAddAfter, *U(tdesc).lptdesc, pTypeInfo);
         AddToStrW(wszAddTo, wszAsterix);
         break;
         case VT_USERDEFINED:
@@ -90,6 +125,118 @@ #define VTADDTOSTR(x) case x:\
     }
 }
 
+int EnumVars(ITypeInfo *pTypeInfo, int cVars, HTREEITEM hParent)
+{
+    int i;
+    TVINSERTSTRUCT tvis;
+    VARDESC *pVarDesc;
+    BSTR bstrName;
+    WCHAR wszText[MAX_LOAD_STRING];
+    WCHAR wszAfter[MAX_LOAD_STRING];
+
+    U(tvis).item.mask = TVIF_TEXT;
+    U(tvis).item.cchTextMax = MAX_LOAD_STRING;
+    U(tvis).item.pszText = wszText;
+    tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
+    tvis.hParent = hParent;
+
+    for(i=0; i<cVars; i++)
+    {
+        if(FAILED(ITypeInfo_GetVarDesc(pTypeInfo, i, &pVarDesc))) continue;
+        if(FAILED(ITypeInfo_GetDocumentation(pTypeInfo, pVarDesc->memid, &bstrName,
+                NULL, NULL, NULL))) continue;
+
+        memset(wszText, 0, sizeof(wszText));
+        memset(wszAfter, 0, sizeof(wszAfter));
+        CreateTypeInfo(wszText, wszAfter, pVarDesc->elemdescVar.tdesc, pTypeInfo);
+        AddToStrW(wszText, wszSpace);
+        AddToStrW(wszText, bstrName);
+        AddToStrW(wszText, wszAfter);
+
+        SendMessage(typelib.hTree, TVM_INSERTITEM, 0, (LPARAM)&tvis);
+        SysFreeString(bstrName);
+        ITypeInfo_ReleaseVarDesc(pTypeInfo, pVarDesc);
+    }
+
+    return 0;
+}
+
+int EnumFuncs(ITypeInfo *pTypeInfo, int cFuncs, HTREEITEM hParent)
+{
+    int i;
+    TVINSERTSTRUCT tvis;
+    FUNCDESC *pFuncDesc;
+    BSTR bstrName;
+
+    U(tvis).item.mask = TVIF_TEXT;
+    tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
+    tvis.hParent = hParent;
+
+    for(i=0; i<cFuncs; i++)
+    {
+        if(FAILED(ITypeInfo_GetFuncDesc(pTypeInfo, i, &pFuncDesc))) continue;
+        if(FAILED(ITypeInfo_GetDocumentation(pTypeInfo, pFuncDesc->memid, &bstrName,
+                NULL, NULL, NULL))) continue;
+
+        U(tvis).item.cchTextMax = SysStringLen(bstrName);
+        U(tvis).item.pszText = bstrName;
+
+        SendMessage(typelib.hTree, TVM_INSERTITEM, 0, (LPARAM)&tvis);
+        SysFreeString(bstrName);
+        ITypeInfo_ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+    }
+
+    return 0;
+}
+
+int EnumImplTypes(ITypeInfo *pTypeInfo, int cImplTypes, HTREEITEM hParent)
+{
+    int i;
+    TVINSERTSTRUCT tvis;
+    ITypeInfo *pRefTypeInfo;
+    HREFTYPE hRefType;
+    TYPEATTR *pTypeAttr;
+    BSTR bstrName;
+    WCHAR wszInheritedInterfaces[MAX_LOAD_STRING];
+
+    if(!cImplTypes) return 0;
+
+    LoadString(globals.hMainInst, IDS_INHERITINTERFACES, wszInheritedInterfaces,
+            sizeof(WCHAR[MAX_LOAD_STRING]));
+
+    U(tvis).item.mask = TVIF_TEXT;
+    U(tvis).item.cchTextMax = MAX_LOAD_STRING;
+    U(tvis).item.pszText = wszInheritedInterfaces;
+    tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
+    tvis.hParent = hParent;
+
+    tvis.hParent = TreeView_InsertItem(typelib.hTree, &tvis);
+
+    for(i=0; i<cImplTypes; i++)
+    {
+        if(FAILED(ITypeInfo_GetRefTypeOfImplType(pTypeInfo, i, &hRefType))) continue;
+        if(FAILED(ITypeInfo_GetRefTypeInfo(pTypeInfo, hRefType, &pRefTypeInfo)))
+            continue;
+        if(FAILED(ITypeInfo_GetDocumentation(pRefTypeInfo, MEMBERID_NIL, &bstrName,
+                NULL, NULL, NULL))) continue;
+        if(FAILED(ITypeInfo_GetTypeAttr(pRefTypeInfo, &pTypeAttr))) continue;
+
+        U(tvis).item.cchTextMax = SysStringLen(bstrName);
+        U(tvis).item.pszText = bstrName;
+
+        hParent = TreeView_InsertItem(typelib.hTree, &tvis);
+        EnumVars(pRefTypeInfo, pTypeAttr->cVars, hParent);
+        EnumFuncs(pRefTypeInfo, pTypeAttr->cFuncs, hParent);
+        EnumImplTypes(pRefTypeInfo, pTypeAttr->cImplTypes, hParent);
+
+        SysFreeString(bstrName);
+        ITypeInfo_ReleaseTypeAttr(pRefTypeInfo, pTypeAttr);
+        ITypeInfo_Release(pRefTypeInfo);
+    }
+
+    return 0;
+}
+
 int PopulateTree(void)
 {
     TVINSERTSTRUCT tvis;
@@ -101,7 +248,9 @@ int PopulateTree(void)
     BSTR bstrName;
     BSTR bstrData;
     WCHAR wszText[MAX_LOAD_STRING];
+    WCHAR wszAfter[MAX_LOAD_STRING];
     HRESULT hRes;
+    HTREEITEM hParent;
 
     const WCHAR wszFormat[] = { '%','s',' ','(','%','s',')','\0' };
 
@@ -117,10 +266,9 @@ int PopulateTree(void)
     const WCHAR wszTKIND_UNION[]
         = { 't','y','p','e','d','e','f',' ','u','n','i','o','n',' ','\0' };
 
-    U(tvis).item.mask = TVIF_TEXT|TVIF_CHILDREN;
+    U(tvis).item.mask = TVIF_TEXT;
     U(tvis).item.cchTextMax = MAX_LOAD_STRING;
     U(tvis).item.pszText = wszText;
-    U(tvis).item.cChildren = 1;
     tvis.hInsertAfter = (HTREEITEM)TVI_LAST;
     tvis.hParent = TVI_ROOT;
 
@@ -152,6 +300,7 @@ int PopulateTree(void)
         ITypeInfo_GetTypeAttr(pTypeInfo, &pTypeAttr);
 
         memset(wszText, 0, sizeof(wszText));
+        memset(wszAfter, 0, sizeof(wszAfter));
         switch(pTypeAttr->typekind)
         {
 #define TKINDADDTOSTR(x) case x:\
@@ -169,7 +318,8 @@ #define TKINDADDTOSTR(x) case x:\
                 AddToStrW(wszText, bstrName);
                 if(SUCCEEDED(ITypeInfo_GetRefTypeOfImplType(pTypeInfo, -1, &hRefType)))
                 {
-                    SendMessage(typelib.hTree, TVM_INSERTITEM, 0, (LPARAM)&tvis);
+                    hParent = TreeView_InsertItem(typelib.hTree, &tvis);
+                    EnumImplTypes(pTypeInfo, pTypeAttr->cImplTypes, hParent);
                     memset(wszText, 0, sizeof(wszText));
 
                     ITypeInfo_GetRefTypeInfo(pTypeInfo, hRefType, &pRefTypeInfo);
@@ -182,16 +332,22 @@ #define TKINDADDTOSTR(x) case x:\
                 break;
             case TKIND_ALIAS:
                 AddToStrW(wszText, wszTKIND_ALIAS);
-                CreateTypeInfo(wszText, pTypeAttr->tdescAlias, pTypeInfo);
+                CreateTypeInfo(wszText, wszAfter, pTypeAttr->tdescAlias, pTypeInfo);
                 AddToStrW(wszText, wszSpace);
                 AddToStrW(wszText, bstrName);
+                AddToStrW(wszText, wszAfter);
                 break;
             default:
                 lstrcpyW(wszText, bstrName);
                 WINE_FIXME("pTypeAttr->typekind ==  %d\n not supported",
                         pTypeAttr->typekind);
         }
-        SendMessage(typelib.hTree, TVM_INSERTITEM, 0, (LPARAM)&tvis);
+        hParent = TreeView_InsertItem(typelib.hTree, &tvis);
+
+        EnumVars(pTypeInfo, pTypeAttr->cVars, hParent);
+        EnumFuncs(pTypeInfo, pTypeAttr->cFuncs, hParent);
+        EnumImplTypes(pTypeInfo, pTypeAttr->cImplTypes, hParent);
+
         ITypeInfo_ReleaseTypeAttr(pTypeInfo, pTypeAttr);
         ITypeInfo_Release(pTypeInfo);
         SysFreeString(bstrName);


More information about the wine-patches mailing list