说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在VB中使用API函数 (之三)

HTML文档下载 WORD文档下载 PDF文档下载
在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))

该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.
VB中感叹号“!”与圆点“.”的用法差异 VB中如何实现注册表的读写 VB中实现“擦视”技术 Visual Basic 2000年问题 Visual Basic 的未来 Visual Basic 命令分类表 Visual Basic三级跳 Visual Basic使用技巧 Visual Basic中的子类处理技术 Visual Basic中软件封面技术探秘 VisualBasic 软件设计中的几个问题 Windows 95/NT 运行了多长时间 -VB资料 Windows 的登录资料库 -VB资料 把回车键变成TAB键-VB资料 把文件置入到Text或RichText中 -VB资料 避免按 [ENTER] 回车键产生的“嘀”声 -VB资料 避免使用全局变量-VB资料 避免装载多份应用程序-VB资料 不定个数的参数 -VB资料 不在任务栏中显示,只能在Ctrl+Alt+Del对话框中显示或者干脆什么也不显示数 -VB资料 处理 Dropdown List型 Combo的录入问题-VB资料 VB创建和删除快捷方式 从程序中生成 exe 文件 -VB资料 打开和关闭CD-ROM 驱动器 -VB资料 打开和关闭其他应用 -VB资料 打开一个超连接 -VB资料 当前操作系统的语言集-VB资料 当前系统目录-VB资料 得到磁盘上剩余空间的值-VB资料 调用“添加打印机”对话框 -VB资料 调整分辩率和取当前分辩率 -VB资料 哪里有莫文蔚的《the way you make me feel》国语版的? 切~~~~~~~~菜~~~~~~~~~ 斑竹,我觉得这几天CSDN上很无聊,怎么老有人弱智地问重复的或者以前已有答案的问题?他们不知道可以search先? 谁知道哪里有bmp图片可以下载,给个详细网址,多谢 VC 兼职? 荷兰国旗问题 ASP刚学,用什么方式好吗 斑竹!!!!!!!!!!!!!!!! 关于IE浏览 请问vb如何访问foxpro 6.0的数据库,最好有源程序,谢谢. he_cti@163.net 算了,散分 我散,我散,我散散散 散3 发分!!!! 发分!!!!! 发分!!!!!!!! 发分!!!!!!!!!!!! 发分!!!!!!!!!!!!!!!!!!! 请问如何去掉测试版软件的“购买”提示框???急急急急!!! 有关获取HTML中Frames的问题? 给分!!!!!啊 给分!!!!!啊!! 给分!!!!!啊!!!!!! 给分!!!!!啊!!!!!!!!!!!!! 给啊!!!!!!!!!!!!! 不是俺蓄意谋两位帮主的反,实在是 ... APPLET连接数据库。。。(我已经每粉了) 千分散尽不复来!!! 千分散尽不复来!!!! 千分散尽不复来!!!!! 千分散尽不复来!! 千分散尽不复来!!!!!!!! 千分散尽不复来!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!! 用分把灌水乐园咽死!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!!!!! 千分散尽不复来~ 千分散尽不复来~! 请教数据窗口的问题 千分散尽不复来? 千分散尽不复来?! 有LVS_OWNDATA属性的CListCtrl 加图标的问题,25分 在做会员注册时,在添加新数据页,程序一运行就在RS.updata出错,为什么(原程序) 高手请你回答我啦!!!! 我要回家了,第一个给300 哪有msproxy下载????? 请问要怎么样才能在自己写的程序运行时让用户无法使用开始菜单? jdbc的版本 甲数的16%,等于乙数的32%,甲数是80,乙数是( ),如果乙数是80,甲数是( ) 数学有三个未知数的均值不等式的题怎么做.例:a、b、c属于R,证明:a方+b方+c方大于等于ab+bc+ca 我太笨 x分之0.125等于4分之1比百分之80要过程 已知甲数的五分之二等于乙数的二十五分之八,甲乙两数的比是多少?如果甲数是80则乙数是多少 cosA等于11\14,A等于多少, A加A加B加B得于70,A加B等于多少 已知甲数的5分之2等于乙数的25分之8,甲数是80,则乙数是几?要全 a-a方等于多少 在三角形ABC中,角A=35°,角B=65°,则角C等于多少? 甲数是24,乙数的3分之1等于甲数的8分之1,乙数是多少 √3+1分之2等于几(要求过程) A,B是自然数,A加B等于35,那么A乘B最大是多少 甲数比乙数多60%,乙数比甲数少百分之几? 甲数的4分之3等于乙数的5分之3,甲数是80,乙数是()是100还是150或者80 3—3分之3—2分之一等于多少? 32吨比60吨少百分之几?(百分号前保留一位小数);甲比乙多40,乙是80,甲比乙多百分之几?甲数是20,乙数是30,乙数比甲、乙两数的和少百分之几? 今天1元人民币等于多少日元? a 分之2等于b 分之3,那么a :b 等于( ):( 甲数是80的5分之4,乙数的百分之60是12,甲数比乙数多多少 现在4万日元等于多少人民币 10分之1除于10等于多少? 甲桶油是乙桶油的80%,乙桶是甲桶的百分之几?甲桶油比乙桶油少百分之几?乙桶比甲桶多百分之几? 今日日元汇率 1日元等于多少人民币? 1加1等于几有几种答案 甲数是乙数的倒数,乙数扩大10倍后是50,甲数是() 1600的80%怎么算 1.25等于什么分数 甲数是50,比乙数大10,甲数是乙数的( )%,乙数是甲数的( )%;甲数比乙数多()%;乙数比甲数少() 1600乘百分之四十等于? 1+1为什么等于2? 甲数是乙数的倒数,乙数扩大到原来的10倍后是50,甲数是 一人数的8倍加上68等于80的百分之九十这个数是几 5分之一减6分之一等于【用分数解答】 甲数的5分之1等于乙数的6分之1,乙数是10,求甲数 90加百分之60X等于102,解方程 4个5怎么算等于8 甲数的50%等於乙数的5分之4,如果甲数是10,乙数书多少?如果乙数是10,甲数是多少? 用+ 、-、×、÷、( )和分数把六个6组成四个算式,使运算的结果等于25. 4个五怎样算等于8 甲数是50,甲数的10分之1和乙数的2分之1相等,乙数是多少 2,4,6,8中间用+-×÷只能一次算要结果等于25怎么算? 4个8怎么算等于888 甲数的50%等于乙数的5分之4,如果甲数是10,乙数是多少?如果乙数是10,甲数是多少?要列式计算,不要方程 a,5,b,c,d,e,3要求相邻3个数和相等,a,d各等于多少 8000秒等于多少小时 5是10的50%,10是5的()% 甲数是40,乙数是50,甲数是乙数的(). π等于多少{1000位或以上} 649980秒等于多少小时?如何计算?我不知道这个时间应该怎么计算成小时?是按照传统的那种算法吗? 已知甲数的8分之1等于乙数的10分之1甲数是80则乙数是多少 角A加角B加角c加角d加角e 等于? 150000秒等于几个小时怎么计算的? 甲乙两个两位数,甲数的9分之8等于乙数的80%,甲数最大是(),乙数最小是() 在数学中e等于多少 8000小时相当于多少天? 甲数是乙数的80%,乙数是甲数的()%我要式子, 用C++编程用while循环,要求求e的值,e约等于1+1/1!+1/2!+1/3!+.+1/N! 要求直至最后一项的值小于10^- 337218秒等于多少小时多少分 ,怎么算的啊 甲数是乙数的125%,那么乙数是甲数的80%,请能仔细讲解为什么是甲数是5,乙数是4,怎么算的 单纯是不是就等于笨啊?单纯等于笨? 多少比16等于15比多少等于多少比80等于百分之125
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn