【导语】“biophilia”通过精心收集,向本站投稿了9篇在VB中使用API函数 (之一)VB,以下是小编帮大家整理后的在VB中使用API函数 (之一)VB,供大家参考借鉴,希望可以帮助到您。
- 目录
篇1:在VB中使用API函数 (之一)VB
在 VB 中使用API函数 (之一) 什么是API? API(Advanced Programmers Interface,高级 程序员 接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制 Windows 的各个部件(从桌面
在VB中使用API函数 (之一)
什么是API?
API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.
这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.
这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.
同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).
API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).
API 声明
正如在“什么是API”中所说,API函数包含在位于系统目录下的DLL文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.
要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择“声明”,找到所需函数,点击“添加(Add)”并“复制(Copy)”,然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.
你将会遇到一些问题:
假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的 Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如 Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.
在有些情况下,你会得到“不明确的名称”这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.
你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.
消息(Messages)
好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.
所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.
hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)
但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.
小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).
这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).
现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB“好意地”进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB的断点调试功能,这可能会导致VB崩溃!)
需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数.
原文转自:www.ltesting.net
篇2:在VB中使用API函数 (之三)VB
在 VB 中使用API函数 (之三) Any 有些消息的参数声明为Any.这表示该参数是一种可变的类型(你可以以整型,字符串,用户自定义或其他的类型来传递). 这有一个这样的例子: Public Declare Function SendMessage Lib “User32” Alias “SendMessageA” ByVal Hwnd as
在VB中使用API函数 (之三)
Any
有些消息的参数声明为Any.这表示该参数是一种可变的类型(你可以以整型,字符串,用户自定义或其他的类型来传递).
这有一个这样的例子:
Public Declare Function SendMessage Lib “User32” Alias “SendMessageA” ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as Long
lParam 声明为Any并按引用(ByRef)传递.
这里是在这个函数中如果lParam是不同类型的值时应遵循的规则:
如果该值是 传递形式
numeric ByVal(as Long,or as Any)
Null ByVal(as Long,or as Any)
String ByRef(as String,or as Any)
Type ByRef(as Any)
array of Type ByRef(as Any)
如果你的函数声明同上面的一个而且你想传递一个Long型数,你应该这样写:
Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue)
注意尽管头三个参数也是数值,但它们前边并没有ByVal.这是因为在函数声明中它们已经被声明为按值传递(ByVal).第四个参数,由于是按引用传递(ByRef)(VB并不知道你要传递参数的类型),因此你必须加上ByVal 你可以使用别名技术来传递不同类型的参数:
Public Declare Function SendMessageLng Lib “User32” Alias “SendMessageA”(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long
或:
Public Declare Function SendMessageStr Lib “User32” Alias “SendMessageA”(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as String) as Long
注意API参数类型本身是不会改变的.例子中的第四个参数总是一个4字节的长型数.当你按值(ByVal)传递一个Long或 Null时,该4字节长的数值就直接传递给函数.如果你传递一个String或其他的什么,你是按引用(ByRef)传递,VB传递的实际上是变量的地址,也是4个字节.
参数传递
你已经知道如何传递参数了,只需把他放到调用的函数中即刻.然而,当你使用API函数时,在传递参数是有一些你应该注意的 细节. ByVal还是ByRef. 通常情况下,你不用为此担心,VB的API浏览器已经为你做好了一切,只需你输入数值它就会照所声明的方式传递.总的来说,ByVal是把实际的数值传递给函数,而ByRef是把地址传给函数.唯一的麻烦就是 Any 类型. 把字符串传递给API函数也并不难.API函数需要的是字符串首字符的地址,然后读取该地址直到遇到一个Null字符.听起来很糟糕,但只是VB处理字符串的实际方法.你唯一要记住的是一定要按引用传递(ByRef)字符串 当你想得到所需的函数返回值信息时,情况有稍微的一点不同.
这里是GetComputerName函数的声明:
Declare Function GetComputerName Lib “kernel32” Alias “GetComputerNameA”(ByVal lpBuffer As String, nSize As Long) As Long
第一个参数是一个指向字符串的远程指针,第二个参数是字符串的长度.
如果你只是简单的声明一个字符串类型的变量并把它传递给函数,就会出现错误.因此,你首先需要初始化字符串.这里是如何得到计算机名字的例子: Dim Buffer As String
Buffer = Space(255)
Ret& = GetComputerName(Buffer, Len(Buffer))
if Ret& >0 then CompName$ = Left(Buffer, Ret&)
在这里,待传递的字符串被初始化为有255个空格的字符串.我们把它传递给函数同时还有它的长度.如果出错则返回值为0.
CompName中将保存计算机名. 有些函数也需要传递数组,这里是一个例子:
Declare Function SetSysColors Lib “user32” Alias “SetSysColors” (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long
最后两个参数是Long型数组.为了传递数组,你只需传递它的第一个元素.下面是示例代码:
Const COLOR_ACTIVECAPTION = 2
Const COLOR_INACTIVECAPTION = 3
Const COLOR_CAPTIONTEXT = 9
Const COLOR_INACTIVECAPTIONTEXT = 19
Dim SysColor(3) As Long
Dim ColorValues(3) As Long
Dim Ret& SysColor(0) = COLOR_ACTIVECAPTION
SysColor(1) = COLOR_INACTIVECAPTION
SysColor(2) = COLOR_CAPTIONTEXT
SysColor(3) = COLOR_INACTIVECAPTIONTEXT
ColorValues(0) = RGB(58, 158, 58) 注释:深绿
ColorValues(1) = RGB(93, 193, 93) 注释:浅绿
ColorValues(2) = 0 注释:黑色
ColorValues(3) = RGB(126, 126, 126) 注释:灰色
Ret& = SetSysColors(4&, SysColor(0), ColorValues(0))
该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.
原文转自:www.ltesting.net
篇3:在VB中使用API函数 (之二)VB
在VB中使用API函数 (之二) Windows的一些特别之处 这个主题是要告诉你Windows 的一些与在VB中的不同的细节 Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用
在VB中使用API函数 (之二)
Windows的一些特别之处
这个主题是要告诉你Windows 的一些与在VB中的不同的细节
Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.
Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:
PixelXValue=TwipXValueScreen.TwipsPerPixelX
PixelYValue=TwipYValueScreen.TwipsPerPixelY
TwipXValue=PixelXValue*Screen.TwipsPerPixelX
TwipYValue=PixelYValue*Screen.TwipsPerPixelY
我并没有在实际中见到过TwipsPerPixelX 和 TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是“ ”(整除) 而不是 “ / ” ,这是因为像素值必须是整数.
另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.
最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等.
从哪里得到有关函数的说明?
这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档.
为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在BorlandDephli 3.0开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好
注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与 Windows95兼容而依然存在.
API参数类型
如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自 VB
Books Online(标题是:C语言声明到Visual Basic的转换)
Books Online(标题是:C语言声明到Visual Basic的转换)
C 语言数据类型 在VB中的声明 Call with
ATOM ByVal variable As Integer An expression that evaluates to an Integer
BOOL ByVal variable As Long An expression that evaluates to a Long
BYTE ByVal variable As Byte An expression that evaluates to a Byte
CHAR ByVal variable As Byte An expression that evaluates to a Byte
COLORREF ByVal variable As Long An expression that evaluates to a Long
DWORD ByVal variable As Long An expression that evaluates to a Long
HWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long An expression that evaluates to a Long
INT, UINT ByVal variable As Long An expression that evaluates to a Long
LONG ByVal variable As Long An expression that evaluates to a Long
LPARAM ByVal variable As Long An expression that evaluates to a Long
LPDWORD variable As Long An expression that evaluates to a Long
LPINT, LPUINT variable As Long An expression that evaluates to a Long
LPRECT variable As type Any variable of that user-defined type
LPSTR, LPCSTR ByVal variable As String An expression that evaluates to a String
LPVOID variable As Any Any variable (use ByVal when passing a string)
LPWORD variable As Integer An expression that evaluates to an Integer
LRESULT ByVal variable As Long An expression that evaluates to a Long
NULL As Any orByVal variable As Long ByVal Nothing or ByVal 0& orvbNullString
SHORT ByVal variable As Integer An expression that evaluates to an Integer
VOID Sub procedure Not applicable
WORD ByVal variable As Integer An expression that evaluates to an Integer
WPARAM ByVal variable As Long An expression that evaluates to a Long
注释:
你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示“假”(False),其他任何值表示“真”(True).
HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以“H”开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long而且要按值传递(ByVal).
同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.
有些类型以“LP”开头.LP 是Long Pointer的缩写.因此LPWORD实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以“LP”开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与 Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.
NULL也是一种奇怪的类型.你可以从 VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用 ByVal 0& 或 vbNullString.
最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在 VB 中把它声明为 SUB.
原文转自:www.ltesting.net
篇4:在VB中使用API函数 (之四)VB
在VB中使用API函数 (之四) 回调(CallBacks) 所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处理参数,并给你返回值. 回调
在VB中使用API函数 (之四)
回调(CallBacks)
所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处理参数,并给你返回值.
回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明:
Declare Function EnumWindows Lib “User32”ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
第一个参数是你的回调函数的地址,第二个参数是你想传递的的任意数值.该值将被传递到你的函数,于是你就知道了它要调用什么.
VB 5.0已经提供了一个很有用的操作符 AddressOf ,可以得到一个函数的地址.当你调用一个函数时它只能用在参数的前面,下面这种用法是错误的并且会导致出错:
FuncP = AddressOf MyFunction
因此你必须这样调用EnumWindows函数:
Suclearcase/“ target=”_blank“ >ccess& = EnumWindows(AddressOf cbFunc, 58&)
你必须也要自己写回调函数.问题是有很多不同类别的回调并且有各种各样的参数,有关这些参数的描述可以在SDK帮助或MS SDK文档中找到.这里是一个回调的声明:
Function cbFunc (ByVal Hwnd, ByVal lParam) as Long
这里是一个回调的例子:
Private Declare Function GetWindowText Lib ”user32“ Alias ”GetWindowTextA“(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long
Success& = EnumWindows(AddressOf cbFunc, 58&)
Function cbFunc (ByVal Hwnd, ByVal lParam) as Long
If lParam = 58 then 注释:enum windows
Str$ = Space(255)
Ret& = GetWindowText(Str$, Len(Str$))
Debug.Print Left(Str$, Ret&)
End If
End Function
这个例子将列出窗口的标题,(不包含子窗体)
窗口程序
Windows并不知道事件. 这些是VB特有的隐藏Windows获取你的窗口发生事件的真正方法的一种方式.VB很像是一个将Windows语言翻译成VB语言的解释器.
但是事实并非如此,你很快就会遇到.设想你想知道用户何时加亮了菜单选项(不是点击,只是加亮即选择了)VB并不提供这种事件,但你可能见到其他的程序,但你浏览它的菜单时状态栏会出现相应的文字.如果他们能,你为何不能?
OK,这里是大致的真实情况.每个窗口都有一个特殊的程序叫做窗口程序.它实际上是一个回调函数.该函数将在你的窗口发生事件的任何时间发送消息.这样当用户加亮一个菜单项时就会发送一条消息(WM_COMMAND).
那为什么我看不到这条消息呢?这是因为是VB创建窗口程序而不是你.当Windows发送消息时,该程序将为之分派特定的事件,并将其参数转换为比较容易用的事件的参数.但是在有些情况下,它会忽略有些消息而不能收到真实的输入.如果你真的想得到这些消息,你必须对你的窗体进行子类处理,我们将在另外一个主题中谈到.
这里是一个回调窗口程序的声明:
Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
第一个参数指定窗口的句柄,第二个参数是消息的标识符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam时两个32位的数值,它们的意义依赖于消息的类型.
原文转自:www.ltesting.net
篇5:在VB中使用API函数 (之五)VB
在 VB 中使用API函数 (之五) 子类处理 当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势. 子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,
在VB中使用API函数 (之五)
子类处理
当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.
子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.
子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:
Declare Function SetWindowLong Lib ”user32“ Alias ”SetWindowLongA“(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long
第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节.
此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用.
如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.
调用原窗口函数将由CallWindowProc来完成.这里是它的声明:
Declare Function CallWindowProc Lib ”user32“ Alias”CallWindowProcA“(ByVal lpPrevWndFunc As Long,ByVal hWnd As Long,ByVal Msg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.
你指定的返回值也是有意义的,它依赖于发送的消息.
在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下:
Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress)
如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.
这里是子类处理的一个简单示例:
Dim oldWndProc As Long
Private Sub Form_Load
ldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)
End Sub
Private Sub Form_Unload()
Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)
End Sub
Function MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)
Debug.Print wMsg & ” “ & wParam & ” “ & lParam
Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam)
End Function
处理参数
有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.
合并和分离一个数并不需要过多的描述.你能在我们的网站(www.geocities.com/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数.
可以用一下方法检查一个数的第N位是否为1:
If Value and (2^N) then ...
置1
Value = Value Or 2^N
置0
Value = Value And Not 2^N
如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 ”^“ ?).
如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明:
Declare Sub CopyMem Lib ”kernel32“ Alias ”RtlMoveMemory“ (pDest As Any, pSource As Any, ByVal ByteLen As Long)
如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理:
Dim Info As Rect
Call CopyMem(Info, ByVal Addr, len(Info))
注意ByVal关键字.现在,如果你想把信息写回,使用:
Call CopyMem(ByVal Addr, Info, Len(Info))
原文转自:www.ltesting.net
篇6:在VB中使用导入API
在 Visual Basic 中使用导入 API会发现很难找到正确的 dll,我知道 C++ 中有一个 dll,但是,有没有可以从 VB 应用程序调用的 dll 呢?
回答是肯定的:
有两种方法可以完成这项工作。一种方法就是在 VB 的 DECLARE 部分列出您希望调用的 C API,然后利用标准
的调用序列从 VB 调用它,如下面的代码样本所示:
Type SQLCA_STRUCT
sqlcaid As String * 8
sqlcabc As Long
sqlcode As Long
sqlerrml As Integer
sqlerrmc As String * 70
sqlerrp As String * 8
sqlerrd(6) As Long
sqlwarn As String * 11
sqlstate As String * 5
End Type
Public Declare Function sqlepstart Lib ”db2app“ Alias ”sqlepstart_api“
(ByVal junk&, ByRef sqlca As SQLCA_STRUCT) As Integer
'
DB2_start = sqlepstart(0, sqlca) ' Start DB2 call
另一种方法就是生成一个文件,然后发出一条命令在后台执行该函数(当然,取决于您正在试图做什么):
fileno = FreeFile
Open db2file For Output As #fileno
sqlstmt = ”“ + _
”db2start;“ + vbNewLine + _
”quit;“
Print #fileno, sqlstmt ' Write commands to a file
Close #fileno ' Close it and execute the command
db2cmd = ”db2cmd /i /c db2 -tvf “ + db2file ' Generate the command
progID = Shell(db2cmd, vbMinimizedNoFocus) ' Shell out to run it
最后,DB2 的下一个版本将允许您象运行普通的 SQL 表函数那样运行特殊的 API 命令,
电脑资料
这会返回有关目前可在 DB2 中找到的许多管理 API 的结果。因此,无需进行 API 调用,您只需使用 SQL 调用就可从 DB2 获取信。
篇7:在VB中如何使用 Winsock 控件
在VB中如何使用 Winsock 控件
在VB中如何使用 Winsock 控件
衡阳师范学院 徐雨明 邮编:421008 衡阳计量测试中心 肖 琼 邮编:421007
摘要:本文介绍如何利用 WinSock 控件可以与远程计算机建立连接,并通过用户数据文报协议 (UDP)或者传输控制协议 (TCP)进行数据交换,并分别给出Winsock控件使用 UDP 协议和TCP协议进行远程计算机连接的应用实例
关键词:VB、控件、协议
1.引言
1.1 Winsock 控件可能的用途
创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。
创建一个服务器应用程序,作为多个用户的数据的汇入点。
创建“聊天”应用程序。
1.2 选择通讯协议的标准
在使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:
(1、) TCP 协议控件是基于连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。
(2、) UDP 协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。
到底选择哪一种协议通常是由需要创建的应用程序决定的。下面的几个问题将有助于选择适宜的协议:
在收发数据的时候,应用程序是否需要得到客户端或者服务器的确认信息?如果需要,使用 TCP 协议,在收发数据之前先建立明确的连接。
数据量是否特别大(例如图象与声音文件)?在连接建立之后,TCP 协议将维护连接并确保数据的完整性。不过,这种连接需要更多的计算资源,因而是比较“昂贵”的。
数据发送是间歇的,还是在一个会话内?例如,如果应用程序在某个任务完成的时候需要通知某个计算机,UDP 协议是更适宜的。UDP 协议适合发送少量的数据。
1.3 协议的设置
在设计时,可以按如下方式设置应用程序使用的协议:在“属性”窗口中单击“协议”,然后选择 sckTCPProtocol 或者 sckUDPProtocol。也可以使用程序代码来设置 Protocol 属性,如下所示:
Winsock1.Protocol = sckTCPProtocol
1.4 确定计算机的名称
在与远程计算机相连接的时候,需要知道它的 IP 地址或者它的“计算机名”。IP 地址是一串数字,每三个数字为一组,中间用点隔开(形如 xxx.xxx.xxx.xxx)。通常,最易记住的是“计算机名”。
要确定“计算机名”,请按照以下步骤执行:
(1)在计算机的“任务栏”上,单击“启动”。
(2)在“设置“项中,单击“控制面板“。
(3)双击“网络”图标。
(4
)单击“标识”选项卡。
(5)在“计算机名称”框中可以找到计算机的名称。
(6)上面找到的计算机名称可以作为 RemoteHost 属性的值。
2. Winsock控件使用 TCP 协议应用实例
如果应用程序要使用 TCP 协议,那么首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客户端与服务器端可以自由地互相通讯。
下列步骤创建一个非常简单的服务器:
(1
) 要创建一个 TCP 服务器,请按照以下步骤执行:
(2) 创建新的 Standard EXE 工程。
(3) 将窗体的标题改为“TCP 服务器”。
(4) 在窗体中放入一个 Winsock 控件(c:\\windows\\system\\mswinsck.ocx),并将它的名字改为 tcpServer。
(5) 在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个为 txtOutput。
为窗体添加如下的`代码。
Private Sub Form_Load
'将 LocalPort 属性设置为一个整数。
'然后调用 Listen 方法。
tcpServer.LocalPort = 1001
tcpServer.Listen
End Sub
Private Sub tcpServer_ConnectionRequest (ByVal requestID As Long)
'检查控件的 State 属性是否为关闭的。
'如果不是,
'在接受新的连接之前先关闭此连接。
If tcpServer.State sckClosed Then _
tcpServer.Close
'接受具有 requestID 参数的'连接。
tcpServer.Accept requestID
End Sub
Private Sub txtSend_Change()
'名为 txtSend 的 TextBox 控件中
>
'包含了要发送的数据。当用户往文本框中
'键入数据时,使用 SendData 方法
'发送输入的字符串。
tcpServer.SendData txtSend.Text
End Sub
Private Sub tcpServer_DataArrival (ByVal bytesTotal As Long)
'为进入的数据声明一个变量。
'调用 GetData 方法,并将数据赋予名为 txtOutput 的 TextBox 的 Text 属性。
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub
上面的步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。
要创建 TCP 客户端,请按照以下步骤执行:
(1) 在工程中添加一个新的窗体。
(2) 将窗体的标题改为“TCP Client”。
(3)
篇8:在VB中如何使用ping命令。VB
With Visual Basic applications expanding more into the enterprise, basic networking functionality often needs to be duplicated by the application. Using the routine here, you will be able to ping any IP address passed. Ping is a tool that
With Visual Basic applications expanding more into the enterprise, basic networking functionality often needs to be duplicated by the application. Using the routine here, you will be able to ping any IP address passed.
Ping is a tool that helps to verify IP-level connectivity. When troubleshooting, the ping command is used to send an ICMP echo request to a target host name or IP address. Use ping whenever you need to verify that a host computer can connect to the TCP/IP network and network resources. You can also use the ping utility to isolate network hardware problems and incompatible configurations.
It is usually best to verify that a route exists between the local computer and a network host by first using ping and the IP address of the network host to which you want to connect. First try pinging the IP address of the target host to see if it will respond, because this is the simplest case.
The concept in the VB implementation is to pass to a routine the address to ping, and a message under 32 bytes that the ping should return if suclearcase/” target=“_blank” >ccessful. This routine does not worked with named domains; it only works when passed the numerical address itself.
To test this application, you must be connected to a network or to your ISP via dial up networking (DUN).
I do not profess to know anything at all about networking or internet functions ... this code (as a bas file only) was provided to me unsigned. If the author is known, I注释:d appreciate hearing from them so proper credit can be given. Furthermore, it is commented only as far as the author did, with a bit of MSDN descriptions thrown in.
Finally, just to keep the error message lines short (narrow), I注释:ve split them into multiple lines as needed.
BAS Module Code
Add the following code to a BAS module:
--------------------------------------------------------------------------------
Option Explicit
注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:
注释: Copyright ?996-2000 VBnet, Randy Birch, All Rights Reserved.
注释: Some pages may also contain other copyrights by the author.
注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:
注释: You are free to use this code within your own applications,
注释: but you are expressly forbidden from selling or otherwise
注释: distributing this source code without prior written consent.
注释: This includes both posting free demo projects made from this
注释: code as well as reproducing the code in text or html format.
注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:注释:
Private Const IP_SUCCESS As Long = 0
Private Const IP_STATUS_BASE As Long = 11000
Private Const IP_BUF_TOO_SMALL As Long = (11000 + 1)
Private Const IP_DEST_NET_UNREACHABLE As Long = (11000 + 2)
Private Const IP_DEST_HOST_UNREACHABLE As Long = (11000 + 3)
Private Const IP_DEST_PROT_UNREACHABLE As Long = (11000 + 4)
Private Const IP_DEST_PORT_UNREACHABLE As Long = (11000 + 5)
Private Const IP_NO_RESOURCES As Long = (11000 + 6)
Private Const IP_BAD_OPTION As Long = (11000 + 7)
Private Const IP_HW_ERROR As Long = (11000 + 8)
Private Const IP_PACKET_TOO_BIG As Long = (11000 + 9)
Private Const IP_REQ_TIMED_OUT As Long = (11000 + 10)
Private Const IP_BAD_REQ As Long = (11000 + 11)
Private Const IP_BAD_ROUTE As Long = (11000 + 12)
Private Const IP_TTL_EXPIRED_TRANSIT As Long = (11000 + 13)
Private Const IP_TTL_EXPIRED_REASSEM As Long = (11000 + 14)
Private Const IP_PARAM_PROBLEM As Long = (11000 + 15)
Private Const IP_SOURCE_QUENCH As Long = (11000 + 16)
Private Const IP_OPTION_TOO_BIG As Long = (11000 + 17)
Private Const IP_BAD_DESTINATION As Long = (11000 + 18)
Private Const IP_ADDR_DELETED As Long = (11000 + 19)
Private Const IP_SPEC_MTU_CHANGE As Long = (11000 + 20)
Private Const IP_MTU_CHANGE As Long = (11000 + 21)
Private Const IP_UNLOAD As Long = (11000 + 22)
Private Const IP_ADDR_ADDED As Long = (11000 + 23)
Private Const IP_GENERAL_FAILURE As Long = (11000 + 50)
Private Const MAX_IP_STATUS As Long = (11000 + 50)
Private Const IP_PENDING As Long = (11000 + 255)
Private Const PING_TIMEOUT As Long = 500
Private Const WS_VERSION_REQD As Long = &H101
Private ConstMIN_SOCKETS_REQD As Long = 1
Private Const SOCKET_ERROR As Long = -1
Private Const INADDR_NONE As Long = &HFFFFFFFF
Private Const MAX_WSADescription As Long = 256
Private Const MAX_WSASYSStatus As Long = 128
Private Type ICMP_OPTIONS
Ttl As Byte
Tos As Byte
Flags As Byte
OptionsSize As Byte
OptionsData As Long
End Type
Public Type ICMP_ECHO_REPLY
Address As Long
status As Long
RoundTripTime As Long
DataSize As Long 注释:formerly integer
注释:Reserved As Integer
DataPointer As Long
Options As ICMP_OPTIONS
Data As String * 250
End Type
Private Type WSADATA
wVersion As Integer
wHighVersion As Integer
szDescription(0 To MAX_WSADescription) As Byte
szSystemStatus(0 To MAX_WSASYSStatus) As Byte
wMaxSockets As Long
wMaxUDPDG As Long
dwVendorInfo As Long
End Type
Private Declare Function IcmpCreateFile Lib “icmp.dll” () As Long
Private Declare Function IcmpCloseHandle Lib “icmp.dll” _
(ByVal IcmpHandle As Long) As Long
Private Declare Function IcmpSendEcho Lib “icmp.dll” _
(ByVal IcmpHandle As Long, _
ByVal DestinationAddress As Long, _
ByVal RequestData As String, _
ByVal RequestSize As Long, _
ByVal RequestOptions As Long, _
ReplyBuffer As ICMP_ECHO_REPLY, _
ByVal ReplySize As Long, _
ByVal Timeout As Long) As Long
Private Declare Function WSAGetLastError Lib “WSOCK32.DLL” () As Long
Private Declare Function WSAStartup Lib “WSOCK32.DLL” _
(ByVal wVersionRequired As Long, _
lpWSADATA As WSADATA) As Long
Private Declare Function WSACleanup Lib “WSOCK32.DLL” () As Long
Private Declare Function gethostname Lib “WSOCK32.DLL” _
(ByVal szHost As String, _
ByVal dwHostLen As Long) As Long
Private Declare Function gethostbyname Lib “WSOCK32.DLL” _
(ByVal szHost As String) As Long
Private Declare Sub CopyMemory Lib “kernel32” _
Alias “RtlMoveMemory” _
(xDest As Any, _
xSource As Any, _
ByVal nbytes As Long)
Private Declare Function inet_addr Lib “WSOCK32.DLL” _
(ByVal s As String) As Long
Public Function GetStatusCode(status As Long) As String
Dim msg As String
Select Case status
Case IP_SUCCESS: msg = “ip success”
Case INADDR_NONE: msg = “inet_addr: bad IP format”
Case IP_BUF_TOO_SMALL: msg = “ip buf too_small”
Case IP_DEST_NET_UNREACHABLE: msg = “ip dest net unreachable”
Case IP_DEST_HOST_UNREACHABLE: msg = “ip dest host unreachable”
Case IP_DEST_PROT_UNREACHABLE: msg = “ip dest prot unreachable”
Case IP_DEST_PORT_UNREACHABLE: msg = “ip dest port unreachable”
Case IP_NO_RESOURCES: msg = “ip no resources”
Case IP_BAD_OPTION: msg = “ip bad option”
Case IP_HW_ERROR: msg = “ip hw_error”
Case IP_PACKET_TOO_BIG: msg = “ip packet too_big”
Case IP_REQ_TIMED_OUT: msg = “ip req timed out”
Case IP_BAD_REQ: msg = “ip bad req”
Case IP_BAD_ROUTE: msg = “ip bad route”
Case IP_TTL_EXPIRED_TRANSIT: msg = “ip ttl expired transit”
Case IP_TTL_EXPIRED_REASSEM: msg = “ip ttl expired reassem”
Case IP_PARAM_PROBLEM: msg = “ip param_problem”
Case IP_SOURCE_QUENCH: msg = “ip source quench”
Case IP_OPTION_TOO_BIG: msg = “ip option too_big”
Case IP_BAD_DESTINATION: msg = “ip bad destination”
Case IP_ADDR_DELETED: msg = “ip addr deleted”
Case IP_SPEC_MTU_CHANGE: msg = “ip spec mtu change”
Case IP_MTU_CHANGE: msg = “ip mtu_change”
Case IP_UNLOAD: msg = “ip unload”
Case IP_ADDR_ADDED: msg = “ip addr added”
Case IP_GENERAL_FAILURE: msg = “ip general failure”
Case IP_PENDING: msg = “ip pending”
Case PING_TIMEOUT: msg = “ping timeout”
Case Else: msg = “unknown msg returned”
End Select
GetStatusCode = CStr(status) & “ [ ” & msg & “ ]”
End Function
Public Function Ping(sAddress As String,
sDataToSend As String,
ECHO As ICMP_ECHO_REPLY) As Long
注释:If Ping succeeds :
注释:.RoundTripTime = time in ms for the ping to complete,
注释:.Data is the data returned (NULL terminated)
注释:.Address is the Ip address that actually replied
注释:.DataSize is the size of the string in .Data
注释:.Status will be 0
注释:
注释:If Ping fails .Status will be the error code
Dim hPort As Long
Dim dwAddress As Long
注释:convert the address into a long representation
dwAddress = inet_addr(sAddress)
注释:if a valid address..
If dwAddress INADDR_NONE Then
注释:open a port
hPort = IcmpCreateFile()
注释:and if successful,
If hPort Then
注释:ping it.
Call IcmpSendEcho(hPort, _
dwAddress, _
sDataToSend, _
Len(sDataToSend), _
0, _
ECHO, _
Len(ECHO), _
PING_TIMEOUT)
注释:return the status as ping succes and close
Ping = ECHO.status
Call IcmpCloseHandle(hPort)
End If
Else:
注释:the address format was probably invalid
Ping = INADDR_NONE
End If
End Function
Public Sub SocketsCleanup()
If WSACleanup() 0 Then
MsgBox “Windows Sockets error occurred in Cleanup.”,vbExclamation
End If
End Sub
Public Function SocketsInitialize() As Boolean
Dim WSAD As WSADATA
SocketsInitialize = WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS
End Function
注释:--end block--注释:
Form. Code
To a form. add a command button (Command1), two text boxes (Text1, Text2) to the top of the form, and six text boxes in a control array (Text4(0) - Text4(5)) below. The labels are optional. Add the following to the form.:
--------------------------------------------------------------------------------
Option Explicit
Private Sub Command1_Click()
Dim ECHO As ICMP_ECHO_REPLY
Dim pos As Long
Dim success As Long
If SocketsInitialize() Then
注释:ping the ip passing the address, text
注释:to send, and the ECHO structure.
success = Ping((Text1.Text), (Text2.Text), ECHO)
注释:display the results
Text4(0).Text = GetStatusCode(success)
Text4(1).Text = ECHO.Address
Text4(2).Text = ECHO.RoundTripTime & “ ms”
Text4(3).Text = ECHO.DataSize & “ bytes”
If Left$(ECHO.Data, 1) Chr$(0) Then
pos = InStr(ECHO.Data, Chr$(0))
Text4(4).Text = Left$(ECHO.Data, pos - 1)
End If
Text4(5).Text = ECHO.DataPointer
SocketsCleanup
Else
MsgBox “Windows Sockets for 32 bit Windows ” & _
“environments is not successfully responding.”
End If
End Sub
注释:--end block--注释:
原文转自:www.ltesting.net
篇9:信息技术教案-VB函数
信息技术教案-VB函数
第三节 VB函数 王锋娟 在VB程序中,函数是一种特定的运算。能完成特定的操作。例如:用来求一个数的平方根、正弦值等。由于这些运算或操作在程序中会经常使用到,为此,VB提供了大量的内部函数供我们在编程时调用。VB内部函数按功能可分为 数学函数:数学函数用来完成一些基本的数学计算,其中一些函数的名称与数学中相应函数的名称相同。 转换函数:用来完成转换工作。例如,字符转换成数值,十进进制转换成十六进制数等。 字符串函数:用来完成对字符串的.操作与处理。如字符串的长度、除去字符串中的空格以及截取字符串等。 日期、时间函数:用于操作日期与时间,例如获得当前的系统时间,求出某一天是星期几等。 部分Visual Basic函数 类别 函数 功能 举例 结果 数学 Abs(x) Int(x) Fix(x) Sin(x) Cos(x) Spr(x) 返回参数的绝对值 返回参数的整数部分 返回参数的整数部分 返回参数的正弦值 返回参数的余弦值 返回参数的平方根 Abs(-6.5) Int(8.4) Fix(8.2) Sin(0) Cos(0) Spr(25) 6.5 8 8 0 1 5 转换 Hex(x) Val(x) Str(x) Lcase(x) Ucase(x) 将十进制数转换成十六进制 将数字字符串转换成数值 将数值转换为字符串 将大写字母转换成小写字母 将小写字母转换成大写字母 Hex(100) Val(“123.4ab56”) Str(123.4) Lcase(“HCQ”) Ucase(“hcq”) 64 123.4 “123.4” “hcq” “HCQ” 字符串 Left(s , n) Right(s , n) Len(s) Ltrim(s) Rtrim(s) Trim(s) Space(n) 返回字符串左边的n个字符 返回字符串右边的n个字符 返回字符串的长度 去掉字符串左边的空格 去掉字符串右边的空格 去掉字符串两边的空格 产生n个空格的字符串 Left(“morning , 4”) Right(“morning,2”) Len(“ABCDEF”) Ltrim(“ ABC”) Rtrim(“ABC ”) Trim(“ ABC “) Space(3) “ning” “morn” 6 “ABC” “ABC” “ABC” “ ” 日期 时间 Time Timer Date Now Day Month Year Weekday 返回当前的系统时间 返回从午夜开始到现在经过的秒数 返回当前的系统日期 返回当前的系统日期与时间 返回日期代号(1~31) 返回月份(1~12) 返回年份 返回表示星期的代号,星期日为1; 星期一为“2”……星期六为“7” Time Timer Date Now Day(“2002,9,7”) Month(“2002,9,7”) Year(“2002,9,7”) Weekday(“2002,9,7”) 7 9 2002-9-7 7 Loadpicture RGB( ) 为VB图片框或图像框装载图片 Loadpicture( ) Rgb(red, green, blue) 随机 Rnd(x) 返回一个随机数值 Rnd 0~1之间的某数 注: (1)Int 函数和Fix函数的不同之处在于,如果参数x为负数,则Int返回小于或等于该参数的第一个负整数,而Fix 则会返回大于或等于参数的第一个负整数。 例如:Int(-8.4)=-9而Fix (-8.4)=-8 (2)Val 函数在执行转换时,在它不能识别为数字的第一个字符上,停止读入字符串。 函数编程练习: 1、 在窗体上建立3个文本框和一个命令按钮,各对象的设置如下表: 对象 属性 值 窗体 文本框1 文本框2 文本框3 按钮1 Caption text text text caption 字符转换函数 text1 text2 text3 确定 事件:单击“确定”时,text1中显示“Good Morning Students” text2中显示小写 text3中显示大写 2、 改变以上按钮的单击事件过程代码,获得当前时间、日期、星期★ vb心得体会范文
★ vb试题及答案
★ VB学习心得体会
★ vb实习报告
★ vb教学设计
★ 职高VB教学心得
★ VB实训总结
在VB中使用API函数 (之一)VB(精选9篇)




