VB 9.0, C# 3.0 API 查看器
这是 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
中。
类
CConst
、CDeclare
、CSubs
和 CTypes
类拥有几乎相同的属性和变量。以下是类属性和变量的列表。它们都实现了 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.vbDim ConstListCSharp As SortedList
.......CConst.vbDim DeclareList As SortedList
...........CDeclare.vbDim DeclareListCSharp As SortedList
.....CDeclare.vbDim TorpedoeList As SortedList
..........CSubs.vbDim TorpedoeListCSharp As SortedList
....CSubs.vbDim TypeList As SortedList
..............CTypes.vbDim 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 日。