home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / oleaut / browseh / vb.frm (.txt) < prev    next >
Encoding:
Visual Basic Form  |  1996-04-30  |  11.1 KB  |  351 lines

  1. VERSION 4.00
  2. Begin VB.Form Form1 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H80000005&
  5.    Caption         =   "Header file generator"
  6.    ClientHeight    =   2010
  7.    ClientLeft      =   4110
  8.    ClientTop       =   2640
  9.    ClientWidth     =   5370
  10.    BeginProperty Font 
  11.       name            =   "MS Sans Serif"
  12.       charset         =   0
  13.       weight          =   700
  14.       size            =   8.25
  15.       underline       =   0   'False
  16.       italic          =   0   'False
  17.       strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    Height          =   2415
  21.    Left            =   4050
  22.    LinkTopic       =   "Form1"
  23.    ScaleHeight     =   2010
  24.    ScaleWidth      =   5370
  25.    Top             =   2295
  26.    Width           =   5490
  27.    Begin VB.CommandButton ChooseTypeLibrary 
  28.       Caption         =   "Choose Type Library"
  29.       Height          =   495
  30.       Left            =   1560
  31.       TabIndex        =   0
  32.       Top             =   360
  33.       Width           =   2415
  34.    End
  35.    Begin MSComDlg.CommonDialog SaveOutputDialog 
  36.       Left            =   120
  37.       Top             =   1080
  38.       _Version        =   65536
  39.       _ExtentX        =   847
  40.       _ExtentY        =   847
  41.       _StockProps     =   0
  42.       DialogTitle     =   "Save Output As"
  43.       Filter          =   "(*.h)|*.h"
  44.    End
  45.    Begin MSComDlg.CommonDialog ChooseTlibDialog 
  46.       Left            =   120
  47.       Top             =   480
  48.       _Version        =   65536
  49.       _ExtentX        =   847
  50.       _ExtentY        =   847
  51.       _StockProps     =   0
  52.       DialogTitle     =   "Choose Type Library"
  53.       Filter          =   "Type Libraries |*.tlb;*.olb;*.dll;*.exe"
  54.    End
  55. Attribute VB_Name = "Form1"
  56. Attribute VB_Creatable = False
  57. Attribute VB_Exposed = False
  58. 'TYPEKIND constants
  59. Const TKIND_ENUM = 0
  60. Const TKIND_RECORD = 1
  61. Const TKIND_MODULE = 2
  62. Const TKIND_INTERFACE = 3
  63. Const TKIND_DISPATCH = 4
  64. Const TKIND_COCLASS = 5
  65. Const TKIND_ALIAS = 6
  66. Const TKIND_UNION = 7
  67. 'INVOKEKIND constants
  68. Const INVOKE_FUNC = 1
  69. Const INVOKE_PROPERTYGET = 2
  70. Const INVOKE_PROPERTYPUT = 4
  71. Const INVOKE_PROPERTYPUTREF = 8
  72. 'VARENUM constants
  73. Const VT_I2 = 2
  74. Const VT_I4 = 3
  75. Const VT_R4 = 4
  76. Const VT_R8 = 5
  77. Const VT_CY = 6
  78. Const VT_DATE = 7
  79. Const VT_BSTR = 8
  80. Const VT_DISPATCH = 9
  81. Const VT_ERROR = 10
  82. Const VT_BOOL = 11
  83. Const VT_VARIANT = 12
  84. Const VT_UNKNOWN = 13
  85. Const VT_I1 = 16
  86. Const VT_UI1 = 17
  87. Const VT_UI2 = 18
  88. Const VT_UI4 = 19
  89. Const VT_I8 = 20
  90. Const VT_UI8 = 21
  91. Const VT_INT = 22
  92. Const VT_UINT = 23
  93. Const VT_VOID = 24
  94. Const VT_HRESULT = 25
  95. Const VT_PTR = 26
  96. Const VT_SAFEARRAY = 27
  97. Const VT_CARRAY = 28
  98. Const VT_USERDEFINED = 29
  99. Const VT_LPSTR = 30
  100. Const VT_LPWSTR = 31
  101. ' TYPEFLAGS
  102. Const TYPEFLAG_FDUAL = &H40
  103. Private Sub ChooseTypeLibrary_Click()
  104. Dim browser As Object
  105. Dim tlib As Object
  106. Dim tinfos As Object
  107. Dim tinfo As Object
  108. Dim funcs As Object
  109. Dim func As Object
  110. Dim params As Object
  111. Dim param As Object
  112. Dim element As Object
  113. Dim elements As Object
  114. Dim member As Object
  115. Dim members As Object
  116. Dim tinfoBase As Object
  117. ' Get name of input type library
  118. On Error GoTo DialogCancel
  119. ChooseTlibDialog.CancelError = True
  120. ChooseTlibDialog.ShowOpen
  121. ' Create Browse Helper (BROWSEH sample)
  122. Set browser = CreateObject("BrowseHelper.Browser")
  123. Set tlib = browser.BrowseTypeLibrary(ChooseTlibDialog.filename)
  124. Set tinfos = tlib.TypeInfos
  125. ' Get name of output header file
  126. On Error GoTo DialogCancel
  127. SaveOutputDialog.CancelError = True
  128. SaveOutputDialog.ShowSave
  129. Open SaveOutputDialog.filename For Output As 1
  130. Print #1, "DEFINE_GUID(LIBID_"; tlib.Name; ","; FormatGUID(tlib.GUIDAsString); ");"
  131. Print #1,
  132. ' Enumerate typeinfos in the type library
  133. For i = 0 To tinfos.Count - 1
  134.   Set tinfo = tinfos.Item(i)
  135.   ' Output header file contents depending on the TYPEKIND of the typeinfo
  136.   Select Case tinfo.TypeInfoKind
  137.      Case TKIND_ENUM     'Enum
  138.         Print #1, "typedef enum{"
  139.         Set elements = tinfo.elements
  140.         For j = 0 To elements.Count - 1
  141.             Set element = elements.Item(j)
  142.             Print #1, Tab(1); element.Name; " = "; element.Value;
  143.             If j < elements.Count - 1 Then
  144.                     Print #1, ",";
  145.             End If
  146.         Next j
  147.         Print #1,
  148.         Print #1, "} "; tinfo.Name; ";"
  149.         
  150.     Case TKIND_RECORD     'Struct
  151.         Print #1, "typedef struct{"
  152.         Set members = tinfo.members
  153.         For j = 0 To members.Count - 1
  154.             Set member = members.Item(j)
  155.             Print #1, Tab(1); TypeToString(member.Type); " "; member.Name; ";"
  156.         Next j
  157.         Print #1, "} "; tinfo.Name; ";"
  158.         
  159.     Case TKIND_UNION     'Union
  160.         Print #1, "typedef union{"
  161.         Set members = tinfo.members
  162.         For j = 0 To members.Count - 1
  163.             Set member = members.Item(j)
  164.             Print #1, Tab(1); TypeToString(member.Type); " "; member.Name; ";"
  165.         Next j
  166.         Print #1, "} "; tinfo.Name; ";"
  167.         
  168.      Case TKIND_INTERFACE     'Interface
  169.         Print #1, "DEFINE_GUID(IID_"; tinfo.Name; ","; FormatGUID(tinfo.GUIDAsString); ");"
  170.         On Error Resume Next
  171.         Set tinfoBase = tinfo.BaseInterface
  172.         If Err.Number > 0 Then 'If there is no base interface
  173.            Print #1, "DECLARE_INTERFACE("; tinfo.Name; ")"
  174.         Else
  175.            Print #1, "DECLARE_INTERFACE_("; tinfo.Name; ", "; tinfoBase.Name; ")"
  176.         End If
  177.         Print #1, "{"
  178.         
  179.         ' Output the functions in the interface
  180.         Set funcs = tinfo.Functions
  181.         For j = 0 To funcs.Count - 1
  182.             Set func = funcs.Item(j)
  183.             Print #1, Tab(2); "STDMETHOD_("; TypeToString(func.ReturnType); ", ";
  184.             Select Case func.InvocationKind
  185.                 Case INVOKE_PROPERTYGET
  186.                    Print #1, "get_";
  187.                 Case INVOKE_PROPERTYPUT
  188.                    Print #1, "put_";
  189.                 Case INVOKE_PROPERTYPUTREF
  190.                    Print #1, "putref_";
  191.             End Select
  192.             Set params = func.Parameters
  193.             If params.Count = 0 Then
  194.                Print #1, func.Name; ")(THIS";
  195.             Else
  196.               Print #1, func.Name; ")(THIS_ ";
  197.             End If
  198.             
  199.             ' Ouput the parameters of the function
  200.             For k = 0 To params.Count - 1
  201.                 Set param = params.Item(k)
  202.                 Print #1, TypeToString(param.Type); " ";
  203.                 Print #1, param.Name;
  204.                 If k < params.Count - 1 Then
  205.                     Print #1, ", ";
  206.                 End If
  207.             Next k
  208.             Print #1, ") PURE;";
  209.             Print #1,
  210.         Next j
  211.         Print #1, "};"
  212.         
  213.     Case TKIND_DISPATCH 'dispinterface or dual interface
  214.         TypeFlags = tinfo.TypeFlags()
  215.         ' Check if this is the dispinterface component of
  216.         ' a dual interface. If so get the interface component of the dual interface
  217.         If TypeFlags And TYPEFLAG_FDUAL Then
  218.             Set tinfo = tinfo.Interface
  219.             Set tinfoBase = tinfo.BaseInterface
  220.             Print #1, "DEFINE_GUID(IID_"; tinfo.Name; ","; FormatGUID(tinfo.GUIDAsString); ");"
  221.             Print #1, "DECLARE_INTERFACE_("; tinfo.Name; ", "; tinfoBase.Name; ")"
  222.             Print #1, "{"
  223.             
  224.             ' Output the functions in the interface
  225.             Set funcs = tinfo.Functions
  226.             For j = 0 To funcs.Count - 1
  227.                 Set func = funcs.Item(j)
  228.                 Print #1, Tab(2); "STDMETHOD_("; TypeToString(func.ReturnType); ", ";
  229.                 Select Case func.InvocationKind
  230.                     Case INVOKE_PROPERTYGET
  231.                        Print #1, "get_";
  232.                     Case INVOKE_PROPERTYPUT
  233.                        Print #1, "put_";
  234.                     Case INVOKE_PROPERTYPUTREF
  235.                       Print #1, "putref_";
  236.                 End Select
  237.                 Set params = func.Parameters
  238.                 If params.Count = 0 Then
  239.                     Print #1, func.Name; ")(THIS";
  240.                 Else
  241.                      Print #1, func.Name; ")(THIS_ ";
  242.                 End If
  243.                 
  244.                 ' Ouput the parameters of the function
  245.                 For k = 0 To params.Count - 1
  246.                     Set param = params.Item(k)
  247.                     Print #1, TypeToString(param.Type); " ";
  248.                     Print #1, param.Name;
  249.                     If k < params.Count - 1 Then
  250.                         Print #1, ", ";
  251.                     End If
  252.                 Next k
  253.                 Print #1, ") PURE;";
  254.                 Print #1,
  255.             Next j
  256.             Print #1, "};"
  257.         End If
  258.         
  259.     Case TKIND_ALIAS     'Alias
  260.         Print #1, "typedef "; TypeToString(tinfo.BaseType); " "; tinfo.Name; ";"
  261.         
  262.     Case TKIND_COCLASS  'CoClass
  263.          Print #1, "DEFINE_GUID(CLSID_"; tinfo.Name; ","; FormatGUID(tinfo.GUIDAsString); ");"
  264.   End Select
  265.   Print #1,
  266. Next i
  267. Close #1
  268. MsgBox SaveOutputDialog.filename + " has been generated", , "Header File Generator"
  269. DialogCancel:   'User cancelled the dialog
  270. End Sub
  271. ' Convert a type to a string
  272. Private Function TypeToString(typeObj As Object) As String
  273.   Dim s As String
  274.   Dim p As Object
  275.   Dim u As Object
  276.   t = typeObj.Type
  277.   Select Case t
  278.      Case VT_I2
  279.          s = "short"
  280.      Case VT_I4
  281.          s = "long"
  282.      Case VT_R4
  283.          s = "float"
  284.      Case VT_R8
  285.          s = "double"
  286.      Case VT_CY
  287.          s = "CURRENCY"
  288.      Case VT_DATE
  289.          s = "DATE"
  290.      Case VT_BSTR
  291.          s = "BSTR"
  292.      Case VT_DISPATCH
  293.          s = "IDispatch FAR*"
  294.      Case VT_ERROR
  295.          s = "SCODE"
  296.      Case VT_BOOL
  297.          s = "VARIANT_BOOL"
  298.      Case VT_VARIANT
  299.          s = "VARIANT"
  300.      Case VT_UNKNOWN
  301.          s = "IUnknown FAR*"
  302.      Case VT_I1
  303.          s = "char"
  304.      Case VT_UI1
  305.          s = "unsigned char"
  306.      Case VT_UI2
  307.          s = "unsigned short"
  308.      Case VT_UI4
  309.          s = "unsigned long"
  310.      Case VT_I8
  311.          s = "64-bit int"
  312.      Case VT_UI8
  313.          s = "unsigned 64-bit int"
  314.      Case VT_INT
  315.          s = "int"
  316.      Case VT_UINT
  317.          s = "unsigned int"
  318.      Case VT_VOID
  319.          s = "void"
  320.      Case VT_HRESULT
  321.          s = "HRESULT"
  322.      Case VT_PTR
  323.          Set p = typeObj.PointerDesc
  324.          s = TypeToString(p) + " FAR*"
  325.      Case VT_SAFEARRAY
  326.          s = "SAFEARRAY FAR*"
  327.      Case VT_USERDEFINED
  328.          Set u = typeObj.UserDefinedDesc
  329.          s = u.Name
  330.      Case VT_LPSTR
  331.          s = "char FAR*"
  332.      Case VT_LPWSTR
  333.          s = "WCHAR FAR*"
  334.          
  335.   End Select
  336.   If t And &H2000 Then
  337.      s = "SAFEARRAY(" + s + ")"
  338.   End If
  339.   TypeToString = s
  340. End Function
  341. 'Return a formatted GUID
  342. Private Function FormatGUID(guid As String) As String
  343. s1 = "0x" + Mid(guid, 2, 8) + "L,"
  344. s2 = "0x" + Mid(guid, 11, 4) + "," + "0x" + Mid(guid, 16, 4) + ","
  345. s3 = "0x" + Mid(guid, 21, 2) + "," + "0x" + Mid(guid, 23, 2) + ","
  346. s4 = "0x" + Mid(guid, 26, 2) + "," + "0x" + Mid(guid, 28, 2) + ","
  347. s5 = "0x" + Mid(guid, 30, 2) + "," + "0x" + Mid(guid, 32, 2) + ","
  348. s6 = "0x" + Mid(guid, 34, 2) + "," + "0x" + Mid(guid, 36, 2)
  349. FormatGUID = s1 + s2 + s3 + s4 + s5 + s6
  350. End Function
  351.