VSAPIVIEWER:适用于VS 2008的API查看器

在Vista和Windows 7操作系统上,许多旧版的API查看器已经无法正常工作。为了解决这个问题,开发了VSAPIVIEWER,这是一个基于Pramod Kumar Singh在2002年开发的API查看器的重制版本。Pramod的版本是用VB.NET 7.0编写的。在寻找API查看器的过程中,在MSDN论坛上看到许多询问是否有适用于VS 2008的当前API查看器的问题,但答案总是“没有”。认为这是一个非常需要的工具。

在下载了Pramod的应用并开始阅读他的代码后,逐渐理解了他试图做的事情。

从旧版到新版的转变

如果查看Pramod的实际表单,会发现尽量保持版本与他的版本基本相同,只是一些控件的位置不同,将颜色改回了Control。

加载API文件

常量、函数、子程序和类型在应用程序启动时加载。一个由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

解析API

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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485