VB 版 (精华区)

发信人: zxfsnow (别怕我伤心), 信区: VB
标  题: 针对API初学者的教程第三篇 
发信站: 哈工大紫丁香 (2000年05月31日12:17:32 星期三), 转信

发信人: Keri (呵呵2000), 信区: VB
标  题: 针对API初学者的教程第三篇
发信站: 虎踞龙蟠 (Fri Mar 31 09:28:43 2000), 转信

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 Lo
ng
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"(ByV
al Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as L
ong) as Long
或:
Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA"(ByV
al 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函数的声明:
这里是GetComputerName函数的声明:
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByV
al 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 nChan
ges 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))
该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.


--
不写了,没什么可说的了.....

※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.7.200]

--
-                          KeriKeriKeriKeriKeri
                          拥                  拒
                          有   不敢奢望太多   绝
                          友   只想珍惜现在   爱
                          情                  情
                           KeriKeriKeriKeriKeri
  
--

 以科计为本,以产业报国!
  超越自我,飞跃无限!
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.974毫秒