VB.FRM
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:11k
源码类别:

Windows编程

开发平台:

Visual C++

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