65.9K
CodeProject 正在变化。 阅读更多。
Home

VB 9.0, C# 3.0 API 查看器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (10投票s)

2010 年 7 月 9 日

CPOL

5分钟阅读

viewsIcon

85164

downloadIcon

4223

这是 Pramod Kumar Sing 在 2002 年开发的 API 查看器的重制版。

引言

您是否一直在寻找 VB 9 和 C# 3 的 API 查看器?旧的 API 查看器是否无法在 Vista® 或 Windows 7® 上运行?VSAPIVIEWER 是 Pramod Kumar Singh 于 2002 年开发的 API 查看器 的重制版。我相信 Pramod 的版本是用 VB.NET 7.0® 编写的。

在寻找 API 查看器的过程中,我在 MSDN 论坛上看到了许多问题,询问是否有人知道可以获取 VS 2008® 最新 API 查看器的网站,而答案总是“否”。我认为这是一个非常需要的实用工具。

背景

在下载了 Pramod 的应用程序并开始阅读他的代码后,我终于开始理解他想做什么。

从旧应用程序到新应用程序的剖析

如果您查看 Pramod 的实际窗体,您会发现我尽量保持我的窗体与他的基本相同,只是某些控件的位置不同,并且我将颜色改回了 Control。:) 将数据文件从 WIN32API.txt 更新到 API32.txt 是一项繁重的工作。API32.txt 的大小是 WIN32API.txt 的两倍。我无法在应用程序启动时加载它。我不明白原因,所以我将 API32.txt 文件分解成四个不同的、较小的文件(已包含),放在 Bin\Debug\API\ 文件夹中。这似乎效果很好,所以我就这样做了。

加载 API 文件!

常量、函数、子程序和类型在应用程序启动时加载。一个启动画面(由 Digital Thunder 编写,并为此应用程序进行了修改)显示了正在加载的内容。这是在 Form_Load 事件中完成的。代码如下所示。

Private Sub frmViewerNet_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Me.Load

    FormSplash.Status("Loading Constants!")
    LoadConstants()

    FormSplash.Status("Loading Functions!")
    LoadFunctions()

    FormSplash.Status("Loading Subs!")
    LoadSubs()

    FormSplash.Status("Loading Types!")
    LoadTypes()
End Sub

启动画面通过 Private Delegate Sub UpdateStatus(ByVal text As String) 在单独的线程上更新。FormSplash.Status 子程序接收一个字符串(如上面的代码所示)来显示我们正在做什么,然后我们调用执行我们想要的工作的子程序或函数。上面代码中调用的子程序大多是相同的代码。下面是一个子程序的代码。

Public Sub LoadConstants()
    Dim m As RSP.ParseAPI = New RSP.ParseAPI(strFile1)
    Dim ThreadConst As Thread

    RSP.Constants = New RSP.CConst()

    ThreadConst = New Thread(AddressOf m.GetConstInfo)
    ThreadConst.Start()

    Try
        ThreadConst.Join()
    Catch e As Exception
        MessageBox.Show("Error occured reading file..." & vbCrLf & strFile1, _
                        "Error...", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try

    Thread.Sleep(250)
End Sub

ParseAPI 类完成了大约百分之九十的工作。在这里,我们打开一个文件(四个 API32 文本文件之一)进行读取、搜索,并添加在 FileHandling.vb 模块中找到的常量。该模块包含 50 个公共常量,我们在 VB® 或 C#® 的代码中使用它们。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

        input = sr.ReadLine()

        While Not input Is Nothing
            If InStr(1, input, APISTARTCONST) <> 0 Then
                'Check for the Comment
                If Not input.StartsWith("'") Then
                    'Look Ahead for false data
                    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
                    'Checking for duplicates.
                        MessageBox.Show("Selection already exists...", "Oops!", _
                             MessageBoxButtons.OK, MessageBoxIcon.Information)
                        txtSelectedItems.Text = ""  'Clearing the textbox.
                    Else
                        txtAddSelected.Text += txtSelectedItems.Text & vbCrLf & vbCrLf
                        txtSelectedItems.Text = ""  'Clearing the textbox.
                    End If
                End If
            Case Else
        End Select
    End If
End Sub

我们首先检查 ListBox 是否有任何项。如果有,就继续。然后我们检查 Combobox 的文本。它是否是 "Constants""Declares""Subs""Types" 并不重要。它会检查任何类型的重复项。如果我们发现重复项,则会向用户显示一个 MessageBox(如下所示),告知我们已找到重复项,并且我们正在将其从 TextBox 中删除。如果没有找到重复项,则将其添加到正确的 TextBox 中。

VSAPIVIEWER/_A_Alert.png

CConstCDeclareCSubsCTypes 类拥有几乎相同的属性和变量。以下是类属性和变量的列表。它们都实现了 IStore 接口。

属性

  • ReadOnly Property Count() As Integer Implements IStore.Count
  • ReadOnly Property GetKey(ByVal index As Integer) As String Implements IStore.GetKey
  • Overloads Function GetDataCSharp(ByVal Key As String) As String Implements IStore.GetDataCSharp
  • Overloads Function GetDataCSharp(ByVal index As Integer) As String Implements IStore.GetDataCSharp

变量及其所在的类文件

  • Dim ConstList As SortedList.............CConst.vb
  • Dim ConstListCSharp As SortedList.......CConst.vb
  • Dim DeclareList As SortedList...........CDeclare.vb
  • Dim DeclareListCSharp As SortedList.....CDeclare.vb
  • Dim TorpedoeList As SortedList..........CSubs.vb
  • Dim TorpedoeListCSharp As SortedList....CSubs.vb
  • Dim TypeList As SortedList..............CTypes.vb
  • Dim TypeListCSharp As SortedList........CTypes.vb

重复代码

在查看旧的 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 = ""
    'Load the listbox from the selected arrayed strings.
    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())
            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())
            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())
            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())
            Next
        Case Else

    End Select

End Sub

这是一个简单的例程,用于通过在 TextBox 中输入的文本来搜索列表框。

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)  'Add text to clipboard for pasting.
End Sub

我使用 WebControl 添加了在线帮助。当列表框中的某个项被点击时,它会自动执行 Google 搜索。现在您所要做的就是找到一个好的链接,如果您不知道如何使用当前选定的 API,它将帮助您。

各位,就这样了。希望大家都能利用好这个应用程序。

历史

  • 项目上传于 2010 年 7 月 9 日。
  • 项目和文章更新于 2010 年 7 月 18 日。
  • 项目和文章更新于 2012 年 5 月 24 日。
© . All rights reserved.