VB怎么用API函数·详细的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB怎么用API函数·详细的?相关的知识,希望对你有一定的参考价值。

包括 声明

一、在VB中声明API函数有两种方法:如果我们只在某个窗体中使用API函数,我们可以在窗体代码的General部分声明它:

声明的语法是:

Private Declare Function ...

Private Declare Sub.....

这里必须采用Private声明,因为这个API函数只能被一个窗体内的程序所调用。

如果我们的程序有多个窗体构成,而且我们需要在多个窗体中使用同一个API函数,就需要在模块中声明了。

先添加一个模块(如图示),

然后采用如下语法声明:

Public Declare Function....

Public Declare Sub....

Public声明的含义是把API函数作为一个公共函数或过程,在一个工程中的任何位置(包括所有的窗体和模块)都能直接调用它。 声明完毕我们就能在程序中使用此API函数了。

二、可采用以下几种方式使用API函数,以SetWindowPos函数为例:

(1)忽略函数返回值的调用:

SetWindowPos Form1.hWnd, -2 ,0 ,0 ,0, 0, 3

注意此时函数的参数是不加括号的。

(2)Call方法调用:

Call SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)

注意这里需要加上括号,但我们不取回函数的返回值。

(3)取得函数返回值的调用:

MyLng = SetWindowPos(Form1.hWnd, -2, 0, 0, 0, 3)

此时需要加上括号,而且我们必须事先定义一个变量(变量的类型与函数返回值类型相同)来存储API函数的返回值。

三、几个问题的说明:

(1)声明中的Lib 和 Alias 是怎么回事

一般情况下WIN32API函数总是包含在Windows系统自带的或是其它公司提供的动态连接库DLL中,而Declare语句中的Lib关键字就用来指定DLL(动态连接库)文件的路径,这样VB才能找到这个DLL文件,然后才能使用其中的API函数。如果我们只是列出DLL文件名而不指出其完整的路径的话,VB会自动到.EXE文件所在目录、当前工作目录、WINDOWS\\SYSTEM目录、WINDOWS目录下搜寻这个DLL文件。所以如果所要使用DLL文件不在上述几个目录下的话,我们应该指明其完整路径。

Alias用于指定API函数的别名,如果我们调用的API函数要使用字符串(参数中包含String型)的话,Alias关键字是必须的。这是因为在ANSI和Unicode字符集中同一API函数的名称可能是不一样的,为了保证不出现声明错误,我们使用Alias关键字指出API函数的别名,一般来说在WIN9X平台下我们把API函数名后加一个大写A作为别名即可。

(2)常见的API参数类型的说明

API函数的参数中最常见的是长整Long型数据类型,例如API中的句柄、一些特定的常量、函数的返回值都是此类型 的值;另外几种常见的参数类型有:整型Integer、Byte型、String型等。

(3)声明中的ByVal是作什么用的

这跟VB的参数传递方式有关,在默认情况下VB是通过地址传递方式传递函数的参数、而有些API函数要求必须采用传值方式来传递函数参数(这两种参数传递方式是不同的,前者传递的是一个指针,而后者要求是参数真实的值)。这样就会发生错误,解决的办法是在API函数参数声明的前面加上ByVal关键字,这样VB就采用传值方式传递参数了。

(4)怎样得到完整的API函数声明

VB自带了API文本查看器API TEXT VIEWER,我们可以在其中找到API函数的完整声明,然后把它粘贴到程序中即可。

如下所示:

Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long

参考技术A API说到底就是一系列的底层函数,是系统提供给 用户用于进入操作系统核心,进行高级编程的途径。通 过在Visual Basic应用程序中声明外部过程就能够 访问Windows API(以及其它的外部DLLs)。在声明 了过程之后,调用它的方法与调用Visual Basic自 己的过程相同。要声明一个DLL过程,需要在代码窗 口的"声明"部分增加一个Declare语句,如果该过 程返回一个值,应将其声明为Function。例如:

Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type

如果过程没有返回值,可将其声明为Sub。

缺省情况下,在标准模块中声明的DLL过程,可 以在应用程序的任何地方调用它。在其他类型的模块 中定义的DLL过程是模块私有的,必须在它们前面 加上Private关键字,以示区分。特别提请注意的 是,在32位的Visual Basic中过程名是区分大小 写的。而在以前的16位版本中并不区分大小写,这 是初学者容易出错的地方。

Declare语句中的Lib子句用来告诉Visual Basic如何找到包含该过程的dll文件。如果引用的过 程属于Windows核心库(User32、Kernel32或 GDI32),则可以不包含文件扩展名。例如:

Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount"() As Long。对于其它DLL, Lib子句须指定文件的路径及扩展名。

如果调用的Windows API过程要使用字符串,那 么在声明语句中必须增加一个Alias子句,以指定 正确的字符集。包含字符串的Windows API函数实 际有两种格武ANSI格式Unicode格式。因此,在 Windows头文件中,每个包含字符串的函数都同时有 ANSI版本和Unicode版本。

例如,下面是SetWindowText函数的两种C语言描 述。可以看到,第一个描述将函数定义为SetWindowTextA, 尾部的"A"表明它是一个ANSI函数:

SetWindowTextA(HWND hWnd,LPCSTR lpString);

第二个描述将它定义为SetWindowTextW,尾部的 "w"表明它是一个Unicode函数:

SetWindowTextW(HWND Hwnd,LPCWSTR lpString);

因为两个函数实际的名称都不是"SetWindow Text",要引用正确的函数就必须增加一个Alias子句:

Private Declare Function SetwindowText Lib "user32" Alias "SetWindowTextA"(ByVal hwnd As Longg,ByVal lpString As String) As Long

请注意, Alias子句后面的字符串必须是过程的 真正名称,必须是区分大小写的。事实上,您只需要 记住,只有Windows NT才支持Unicode格式,而 Windows 95只支持ANSI格式就行了。至于两者的区 别,作一般的应用程序开发是不需要了解的。

VB5专业版在VB目录的\Winapi子目录下,用几 个文件提供了关于API的信息。 Win32api.txt文件中 包含了32位Windows API函数中用到的函数和类型的 结构声明以及全局常量的值。用户可以用VB本身带的外 接程序"API浏览器"来方便地使用Win32api.Txt,如下 所示:

点击菜单文件项的"加载文本文件…"从VB目 录下的WINAPI目录中选择"WIN32API.TXT",就可以 查看WINDOWS 95系统的API函数的声明、常数定义和 数据类型了。例如,我们打算查看函数InverRect() 的声明。首先,点击"搜索"按钮,输入字符串 "InverRect"。在"可选项"栏中,兰色的亮度条将移 动到"InverRect"项上。再点按"添加"按钮,在"选 定项"中就出现"InverRect"在Visual Basic中的 声明了。接下来自然是点按"复制"按钮,然后将窗 口切换到Visual Basic开发环境中,在需要声明API 函数的地方Ctrl+V(粘贴)即可。

上面所讲的声明方法虽然简单,但只有使用WIN DOWS本身的API函数才能这样。对于第三方提供的动 态链接库(DLL)您只有用键盘老老实实地敲了。

第二节:牛刀小试

现在读者一定很想自己亲自试一下,下面举两个 实际应用的例子让大家体会一下API的妙用吧!

1.使一个窗体始终保持在屏幕的最上面

我们知道VB本身自带的函数是难以完成此功能 的,我们可以通过调用Windows的API函数: SetWindowPos达到我们的要求。操作步骤如下:

(1)启动VB5建立一个新工程,在该工程中添加一 个模块(Moudel),在该模块中用上述的"API例览器" 添加如下的该API函数的函数声明和常量声明部分:

'API函数声明

Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

'常量声明

Global Const SWP_HIDEWINDOW = &H80

Global Const SWP_NOACTIVATE = &H10

Global Const SWP_NOCOPYBITS = &H100

Global Const SWP_NOMOVE = &H2

Global Const SWP_NOOWNERZORDER = &H200

Global Const SWP_NOREDRAW = &H8

Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDER

Global Const SWP_NOSIZE = &H1

Global Const SWP_NOZORDER = &H4

Global Const SWP_SHOWWINDOW = &H40

Global Const HWND_BOTTOM = 1

Global Const HWND_BROADCAST = &HFFFF&

Global Const HWND_DESKTOP = 0

Global Const HWND_NOTOPMOST = -2

Global Const HWND_TOPMOST = -1

Global Const HWND_TOP = 0

Global Const Flags=SWP_NOMOVE Or SWP_NOSIZE

这里以"SWP_"开头的常量是表示窗体所具有的 风格,这些常量可以通过VB中的"OR"操作符组合在 一起。而以"HWND_"开头的常量表示窗体在桌面上的 位置。从这些常量的英文单词的意义上读者应该很容 易理解他们所具有的风格了。所以笔者就不一一去说 明了。至于为什么要添加这些常量而不是别的这就要 您去查看Windows SDK关于该函数的帮助文档了。当 然这对于初学者来说有一定的难度,但不要畏惧,只 要您仔细看帮助就会慢慢搞懂的。因为这些API函数 是为C和C++的编程人员编写的,所以如果您懂一点 C++的话会很容易理解的。

(2)现在只要在您想要此功能的地方调用该函数 就可以了,调用的方法如:

Dim Success as Long

SuccesS=SetwindowPos(me.HWnd. HWND_TOPMOST,0,0,0,0,FLAGS)

若Success返回的值不等于零则表示调用成功。

比如在某个窗体的Load事件中加入上述的两行代 码,就可以达到使该窗体始终位于屏幕最上面的目的。

细心的读者可能已经发现上面的例子中的模块声 明中声明了好几个常量,可为什么只用到三个呢?现 在您可以试着改变一下API函数"SetWindowPos"中 的第二个参数或常量FLAGS中的项,看看您的窗体会 出现什么样的效果?

2.VB5中如何屏蔽掉win95中的CTRL_ALT_DEL, CTRL_ESC, ALT_TAB三组热键通过调用API函数"SystemParametersInfo"来实 现。

首先创建一新工程;在此工程中添加一个窗体和 一个模块;在窗体上拖放两个按钮分别命名为 "cmdDisable","cmdEnable";Copy如下代码入模块中:

Public Declare Function SystemParametersInfo Lib "user32" Ahias "SystemParametersInfoA" (ByVal uAction As Long,ByVal uParam As Long, lpvParam As Any,ByVal fuWinIni As Long)AS Long

Public Const SPI_SCREENSAVERRUNNING=97

在窗体的代码编辑区Copy如下代码:

'使三组热键失效

Private Sub cmdDisable_click()

SystemParametersInfo

SPI_SCREENSAVERRUNNING,True,byVal 1&,0

End Sub

Private Sub Form_Unload(Cancel As Integer)

'程序退出前是热键有效

CndEnable_Click

End Sub

若将此功能和屏幕保护程序结合到一起,那您的屏幕 保护程序一定增色许多。

API函数的简单调用例子就是这么容易,相信现在您 对API的调用已不再感到神秘了,接下来我们就看看一个 比较复杂的应用。

第三节:高手进阶

上面的关于API的调用的例子只是为了带您去Win dows API世界中去探索一下。相信您已探索到了一点眉 目并想去实现一些更"好玩"的东西了。好!下面就向您 介绍一个很"好玩"同时又会使您的程序看起来更专业化 的一个API调用。

相信您的机器上一定装有"金山词霸",试着启动它 您发现了什么?启动画面过后它"不见了"。把鼠标移到 桌面的右下角,原来它以图标的形式"藏在" Windows 的托盘中。用鼠标右击它还会弹出一个菜单功能项供您 选择。现在您一定想把自己的程序也放到托盘,这样您的 程序多具有专业水准!

下面是此功能的实现步骤:

1.这里我们调用的API函数是: "Shell_NotifyIcon",在您的模块中添加如下的函数声明 和常量声明:

'以下常量告诉系统在托盘中您的图标上发生了什么 操作

'常量声明

Public Const WM_MOUSEMOVE = &H200 '在图标上移动鼠标

Public Const WM_LBUTTONDOWN = &H201 '鼠标左键按下

Public Const WM_LBUTTONUP = &H202 '鼠标左键释放

Public Const WM_LBUTTONDBLCLK = &H203 '双击鼠标左键

Public Const WM_RBUTTONDOWN = &H204 '鼠标右键按下

Public Const WM_RBUTTONUP = &H205 '鼠标右键释放

Public Const WM_RBUTTONDBLCLK = &H206 '双击鼠标右键

Public Const WM_SETHOTKEY = &H32 '响应您定义的热键

'API函数声明

Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

'自定义一个调用API Shell_NotifyIcon要用到的类 型"NOTIFYICONDATA"

Public Type NOTIFYICONDATA

cdSize As Long 'NOTIFYICONDATA类型的大小

hwnd As Long '你的应用程序窗体的名柄

uId As Long '应用程序图标资源的ID号

uFlags As Long '使那些参数有效它是以下枚举类型中的

'NIF_MESSAGE、NIF_ICON、NIF_TIP三组的组合

uCallbackMessage As Long '鼠标移动时把此消息发给该图标的窗体

hIcon As Long '图标名柄

szTip As String*64 '当鼠标在图标上时显示的Tip文本

End Type

'这是一个枚举类型它告诉API Shell_NotifyIcon去做什么操作

Public Enum enm_NIM_Shell

NIM_ADD=&H40 '在“金碟”中加一图标

NIM_MODIFY=&H1 '修改“金碟”中的图标

NIM_DELETE=&H2 '删除“金碟”中的图标

NIF_MESSAGE=&H1 '使类型"NOTIFYICONDATA"中的uCallbackMessage有效

NIF_ICON=&H2 '使类型"NOTIFYICONDATA"中的hIcon有效

NIF_TIP=&H4 '使类型"NOTIFYICONDATA"中的szTip有效

WM_MOUSEMOVE=&H200 '使鼠标移动消息有效

End Enum

'定义一个"NOTIFYICONDATA"类型的变量

Public nidProgramData As NOTIFYICONDATA

以上是函数及常量声明和自定义的一个类型变量,下 面是此API函数的调用方法:

2. 在窗体上用菜单编辑一个具有如下信息的菜单项:

主菜单:无标题、名称(mainMenu)

子菜单:标题(API编程)、名称(submnul);

标题(退出)、名称(submnu2).

这里只是举个例子,具体的功能你可以根据你的具体需要来编辑此菜单项

3. 在窗体的Load事件中添加如下代码:

Private Sub Form_Load()

'隐藏窗体

With Me

.Top =-10000

.Left = -10000

.WindowState = vbMinimized

End With

'设置类型NOTIFYICONDATA所具有的特征

With nidprogramData

.cbSize = Len(nidProgramData)

.hwnd = Me.hwnd .uld = vbNull

.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE

'触发鼠标移动消息

.uCallbackMessage = WM_MOUSEMOVE

.hIcon = Me.Icon '“托盘”中放入窗体图标,你可以把窗体的图标换成你所喜欢的图标

.szTip ="VB 的 Win32 API 编程" & vbNullChar

End With

'调用该函数

Shell_NotifyIcon NIM_ADD,nidprogramData

End Sub

'根据不同的鼠标消息做不同的操作

Private Sub Form_MouseMove(Button As inte ger, Shift As lnteger, x As Single, Y As Single)

On Error GoTo Form_MouseMove_err:

Dim Result As Long

Dim msg As Long

'X的值依赖与显示模式的设置

If Me.ScaleMode = vbpixels Then

msg = x

Else

msg = x/Screen.TwipsPerPixe1X

End If

Select Case msg

Case WM_LBUTTONUP

'在这里加入鼠标左键释放时你想做的操作

Case WM_LBUTTONDBLCLK

'在这里加入双击鼠标左键时你想做的操作

Case WM_RBUTTONUP

'通常这里弹出你的功能菜单

PopupMenu mainMenu

Case WM_MOUSEISMOVING

'在这里加入鼠标正在移动时你想做的操作

End Select

Exit Sub

Form_MouseMove_err:

'在这里加入你的处理异常错误的代码

End Sub

4.Run你的程序,您是不是看到了象“金山词霸”一样的功能?相信你此时的感觉一定特别“爽”!

API的世界j是丰富多彩的,只要你肯细心地去探索它你一定会获得许多意想不到的好东西。所以笔者觉得定值得每一个具有“好奇”精神的人去探索它。后续的期刊笔者会向读者详细介绍一些更好更“牛”的API调用
参考技术B

1、在进行Windows系统的编程过程中,如果想要改变标题栏的背景颜色,使其不随系统主题变化,一般来说有两个方法:自己设计标题栏和调用系统API进行处理。

2、要自己设计标题栏,可以设置窗口的边界属性(FormBorderStyle)为None,即不显示边界,此种情况下,窗体默认的标题栏就不会显示。

3、若要调用系统API函数来处理,就需要引入相关API。

4、引入API方法:Declare   Function   SetSysColors   Lib   "user32"   Alias   "SetSysColors"   (ByVal   nChanges   As   Long,   lpSysColor   As   Long,   lpColorValues   As   Long)   As   Long   定义标题栏系统常量:Public   Const   COLOR_ACTIVECAPTION   =   2。

5、在引入API相关函数及定义了要求的系统常量后,直接调用函数即可设置标题栏的背景色,如设置标题栏背景色为红色。

参考技术C 我就以获取Windows目录的路径为例子说明一下把先创建一个模块(模块是放全局公用的函数、过程、常数、自定义结构、全局变量等等东西的地方),'声明函数
Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
'创建函数过程
Public Function abs1() As String
Dim sBuffer As String '定义
Dim lSize As String '定义
sBuffer = String(255, 0) 'sBuffer为预定预留255个字符,因为在Windows文件名限为255个字符
lSize = GetWindowsDirectory(sBuffer, Len(sBuffer)) '这里sBuffer获得WINDOWS的路径了,Len(sBuffer)是路径的长度,Len(sBuffer)=10
abs1 = sBuffer '命令给出Function abs1()过程的返回值,试试将sBuffer改成lSize
End Function到这里,abs1()已经返回得到了WINDOWS的路径了最后回到工程里调用函数Private Sub Command1_Click()
'调用函数
Label1.Caption = abs1()
End SubAPI函数在VB就是这样用的了
参考技术D 这里有详细介绍http://blog.csdn.net/paullbm/articles/577816.aspx

VB中const用法

为什么可以这样用Const SPIF_UPDATEINIFILE = &H1??SPIF_UPDATEINIFILE本身不就是vb的一个常数吗(api函数 SystemParametersInfo的参数fuWinIni的一个可取常量),怎么还可以给他赋值呢??这个貌似跟const pi =3.14159不同啊,求高人指点啊。。。。

const类似于常用的dim函数,b中const源于constant,意思为不变常量。用const声明的是固定的整数,字符串。为了在一行中声明若干个常数,可以使用逗号将每个常数赋值分开。用这种方法声明常数时,如果使用了 Public 或 Private 关键字,则该关键字对该行中所有常数都有效。

在给常量赋值的表达式中,不能使用变量,用户自定义的函数,或 Visual Basic 的内部函数(如 Chr)。

注意 常数可以使程序更具可读性,以及易于修改。在程序运行时,常数不会象变量那样无意中被改变。

如果在声明常数时没有显式地使用 As type 子句,则该常数的数据类型是最适合其表达式的数据类型。

在 Sub、Function 或 Property 过程中声明的常数都是该过程的局部常数。在过程外声明的常数,在包含该声明的模块中被定义。在可以使用表达式的地方,都可以使用常数。

CONST定义的是常量,也就是说这个值在整个程序运行过程中不能被修改,首先增加了安全性
其次,比如定义常量PI(圆周率)为3.14,而事后希望改为3.1415。那么就直接修改定义处的值就可以了复次,常量的作用还有避免书写错误和易于修改。

扩展资料:

const修饰的量为一个常量即不能被修改的量。但在C语言(C89)中的const可以不初始化但后续也就无法对其赋值,所以尽管不初始化不会出错。但要使用const修饰的量就需要对其进行初始化。

const修饰的量为一个常量,可以做左值且不能修改它的值。只有当给const修饰量的值不明确的时候会退化成一个常变量。

在一个C++工程中的多个.cpp文件中要用到某一个.cpp文件中const修饰的量是无法访问的,这是由于常量的符号类型为local的,只在当前文件可见,其余文件无法访问。如若想要访问这个const修饰的量,需在定义处加上extern。

参考技术A

用法

为了在一行中声明若干个常数,可以使用逗号将每个常数赋值分开。用这种方法声明常数时,如果使用了 Public 或 Private 关键字,则该关键字对该行中所有常数都有效。

在给常量赋值的表达式中,不能使用变量,用户自定义的函数,或 Visual Basic 的内部函数(如 Chr)。

注意 常数可以使程序更具可读性,以及易于修改。在程序运行时,常数不会象变量那样无意中被改变。

如果在声明常数时没有显式地使用 As type 子句,则该常数的数据类型是最适合其表达式的数据类型。

在 Sub、Function 或 Property 过程中声明的常数都是该过程的局部常数。在过程外声明的常数,在包含该声明的模块中被定义。在可以使用表达式的地方,都可以使用常数。

扩展资料:

语句示例

该示例使用 Const 语句来声明用于代替文字值的常数。Public常数在标准模块的通用部分声明,而不是在类模块中声明。Private 常数可以在任何模块类型的通用部分声明。

缺省情况下常数是私有的。

ConstMyVar=459'声明公用常数。

PublicConstMyString="HELP"'声明私有的整数常数。

PrivateConstMyIntAsInteger=5'在一行中声明多个常数。

ConstMyStr="Hello",MyDoubleAsDouble=3.4567

参考技术B

Const 语句

声明用于代替文字量的常数。

Const 语句示例

该示例使用 Const 语句来声明用于代替文字值的常数。Public
常数在标准模块的通用部分声明,而不是在类模块中声明。Private 常数可以在任何模块类型的通用部分声明。

'缺省情况下常数是私有的。
Const MyVar = 459

'声明公用常数。
Public Const MyString = "HELP"

'声明私有的整数常数。
Private Const MyInt As Integer = 5

'在一行中声明多个常数。
Const MyStr = "Hello", MyDouble As Double = 3.4567

参考技术C const是定义常数,例如:const pi =3.14159,那么你在代码中输入pi就相当于输入3.14159。就是用一个类似变量的东西代替数值提高可读性,但要注意,它不是变量。SPIF_UPDATEINIFILE并不是VB里面的常数,要使用的话必须定义常数。VC有微软提供的支持库,所以可以直接使用。追问

那为什么让它等于&H1呢??

追答

这并不是必须的,人为定义的,你也可以不定义SPIF_UPDATEINIFILE常数,直接在程序里使用&H1,不同的参数传入函数后有不同的结果,而&H1对应的就是“把新的系统参数的设置内容写入用户配置文件”,这是API文档的说明,而让代码可读性更强的话就用Const SPIF_UPDATEINIFILE = &H1,当然,SPIF_UPDATEINIFILE这个名字不是必须的,可以自己改。如果你尝试让它等于&H2,那么Const SPIF_UPDATEINIFILE = &H2这句是没错,但是按照使用的习惯来说,当你传给函数这个参数的时候会发生意想不到的后果,就像把一个单词Apple翻译成香蕉一样。

追问

貌似有点懂了,多谢高手。。。。

本回答被提问者采纳

以上是关于VB怎么用API函数·详细的?的主要内容,如果未能解决你的问题,请参考以下文章

vb60编程中,如何用API函数中的createfile()创建一个文件?

vb 怎么实现多线程

VB API函数sleep在睡眠时,导致窗体不能移动,该如何解决?

API 函数,我怎么在MSDN中查不到!

windowsAPI里面的ShowWindow函数怎么用?主要是关于窗口激活的用法。

VB.NET的API调用