在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