在Vista和Windows 7操作系统上,许多旧版的API查看器已经无法正常工作。为了解决这个问题,开发了VSAPIVIEWER,这是一个基于Pramod Kumar Singh在2002年开发的API查看器的重制版本。Pramod的版本是用VB.NET 7.0编写的。在寻找API查看器的过程中,在MSDN论坛上看到许多询问是否有适用于VS 2008的当前API查看器的问题,但答案总是“没有”。认为这是一个非常需要的工具。
在下载了Pramod的应用并开始阅读他的代码后,逐渐理解了他试图做的事情。
如果查看Pramod的实际表单,会发现尽量保持版本与他的版本基本相同,只是一些控件的位置不同,将颜色改回了Control。
常量、函数、子程序和类型在应用程序启动时加载。一个由Digital Thunder编写的启动屏幕,已经修改以适应这个应用程序,显示正在加载的内容。这是在Form_Load事件中完成的。以下是代码:
    Private Sub frmViewerNet_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        FormSplash.Status("正在加载常量!")
        LoadConstants()
        FormSplash.Status("正在加载函数!")
        LoadFunctions()
        FormSplash.Status("正在加载子程序!")
        LoadSubs()
        FormSplash.Status("正在加载类型!")
        LoadTypes()
    End Sub
    
ParseAPI类完成了大约90%的工作。这是打开一个文件,其中一个API32文本文件,用于读取、搜索和添加在模块FileHandling.vb中找到的常量的地方,该模块包含在VB或C#代码中使用的50个公共常量。ParseAPI类文件中的一个子程序是Public Sub GetConstInfo()。以下是代码:
    Public Sub GetConstInfo()
        Dim sKey As String
        Dim sCSharp As String
        If pFile <> "" Then
            If Not File.Exists(pFile) Then
                Types = Nothing
                Return
            End If
            Dim sr As StreamReader = File.OpenText(pFile)
            Dim input As String = sr.ReadLine()
            While Not input Is Nothing
                If InStr(1, input, APISTARTCONST) <> 0 Then
                    '检查注释
                    If Not input.StartsWith("'") Then
                        '向前看错误的数据
                        If Split(input, "=").Length() <= 2 Then
                            sKey = Split(input, "'")(1).ToString()
                            input = APISCOPE & input
                            sCSharp = input
                            sCSharp = sCSharp.Replace("Const", "const int") + ";"
                            sCSharp = sCSharp.Replace("'", "//")
                            Constants.Add(sKey, input)
                            Constants.Add(sKey, sCSharp, True)
                        End If
                    End If
                End If
                input = sr.ReadLine()
            End While
            sr.Close()
            Return
        Else
            Return
        End If
    End Sub
    
在四个API文件中找到的所有数据存储在应用程序中后,应用程序最终显示出来,终于可以使用它了。
有人指出应用程序的一个重要部分是,如果有人不小心按了两次添加按钮,就会添加重复项。手动删除这些项相当耗时,所以想到了这段代码:
    Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        If lstItems.Items.Count > 0 Then
            Select Case cmbAPI.Text
                Case RSP.CMB_TYPES, RSP.CMB_CONSTANTS, RSP.CMB_DECLARES, RSP.CMB_SUBS
                    If txtSelectedItems.Text = "" Then
                        Exit Sub
                    Else
                        strTemp = Trim(txtSelectedItems.Text)
                        If InStr(txtAddSelected.Text(), strTemp) > 0 Then
                            '检查重复项。
                            MessageBox.Show("选择已存在...", "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Information)
                            txtSelectedItems.Text = ""
                            '清除文本框。
                        Else
                            txtAddSelected.Text += txtSelectedItems.Text & vbCrLf & vbCrLf
                            txtSelectedItems.Text = ""
                            '清除文本框。
                        End If
                    End If
                Case Else
            End Select
        End If
    End Sub
    
CConst、CDeclare、CSubs和CTypes类具有非常相似的属性和变量。以下是类属性和变量的列表。它们都实现了IStore接口。
在查看旧版API查看器代码时,注意到所有单选按钮、组合框和列表框中有很多重复代码。由于不明白为什么有这么多重复代码,一个朋友告诉删除所有这些代码,从头开始。这是完成的,cmbAPI_SelectedIndexChanged(代码如下)是使用两个不同地方的旧代码创建的。Select Case语句来自原始的combobox.click事件,Case语句中的代码来自FileHandling.vb文件。
    Private Sub cmbAPI_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbAPI.SelectedIndexChanged
        txtSelectedItems.Text = ""
        '从选定的数组字符串加载列表框。
        Select Case cmbAPI.Text
            Case RSP.CMB_CONSTANTS
                lstItems.Items.Clear()
                For i As Integer = 0 To RSP.Constants.Count - 1
                    Dim sKey As String
                    sKey = RSP.Constants.GetKey(i)
                    If sKey <> "" Then
                        lstItems.Items.Add(RSP.Constants.GetKey(i).ToString())
                    End If
                Next
            Case RSP.CMB_DECLARES
                lstItems.Items.Clear()
                For i As Integer = 0 To RSP.Declares.Count - 1
                    Dim sKey As String
                    sKey = RSP.Declares.GetKey(i)
                    If sKey <> "" Then
                        lstItems.Items.Add(RSP.Declares.GetKey(i).ToString())
                    End If
                Next
            Case RSP.CMB_TYPES
                lstItems.Items.Clear()
                For i As Integer = 0 To RSP.Types.Count - 1
                    Dim sKey As String
                    sKey = RSP.Types.GetKey(i)
                    If sKey <> "" Then
                        lstItems.Items.Add(RSP.Types.GetKey(i).ToString())
                    End If
                Next
            Case RSP.CMB_SUBS
                lstItems.Items.Clear()
                For i As Integer = 0 To RSP.Torpedoes.Count - 1
                    Dim sKey As String
                    sKey = RSP.Torpedoes.GetKey(i)
                    If sKey <> "" Then
                        lstItems.Items.Add(RSP.Torpedoes.GetKey(i).ToString())
                    End If
                Next
            Case Else
        End Select
    End Sub
    
这是一个简单的例程,用于在文本框中键入文本搜索列表框。
    Private Sub txtSearch_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
        If lstItems.Items.Count > 0 Then
            lstItems.SelectedIndex = lstItems.FindString(txtSearch.Text)
        End If
    End Sub
    
复制文本以粘贴到代码中:
    Private Sub btnCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopy.Click
        Clipboard.SetText(txtAddSelected.Text)
        '将文本添加到剪贴板以粘贴。
    End Sub