VB 版 (精华区)
发信人: zxfsnow (最近睡眠太少), 信区: VB
标 题: vb中访问api函数之防错技巧
发信站: 哈工大紫丁香 (2000年06月07日20:20:07 星期三), 转信
发信人: Keri (呵呵2000), 信区: VisualBasic
标 题: vb中访问api函数之防错技巧
发信站: 北大未名 (Wed May 24 18:45:11 2000), 转信
vb中访问api函数之防错技巧
郭少越
功能强大的api(应用程序接口)函数对于vb程序员来说,不愧是很好的编程工具,
然而使用api函数的程序员也许都遇到这样的现象。在vb集成环境下,程序运行后,出现
一错误信息对话框,按确定键后系统自动退出vb集成环境,此时如果你的程序尚未存盘
,那末很遗憾挽回损失已回天乏力。最后一次存盘之后的程序都不复存在。这是你对ap
i函数使用不当引起的一般保护故障(gpf)。
当一个gpf错发生时,你应允许windows关闭你的应用。有些情况下你可能需要退出
windows或者重新引导系统。出错程度视哪里内存被破坏而定。dll(动态链接库)函数
中的类型不一致等错误是gpf错的主要原因。这些错误会导致gpf甚至使windows系统完全
崩溃(需要重新引导系统)。
下面谈避免gpf的一些技巧。
用别名来提供强类型检查是避免gpf的有效措施之一。有些情况下,dll函数可以接
受多种类型,loadcursor函数就是这样一个例子,其定义如下:
hcursor loadcursor(hinstance,lpcursorname)
这里hcursor是一个指向光标对象的16位句柄,hinstance是一个16位实例句柄
,lpcursorname是光标的名字或者是光标资源的32位整数id。为了支持两种类型的
lpcursorname参数。vb有必要包含如下两个声明:
declarefunction loadcursor lib"user"(byval hinstance as integer,_
byval lpcursorname as string)_
as integer
和
declarefunction loadcursor lib"user"(byval hinstance as integer,_
byvallpcursorname as long)_
as integer
但是,这两个声明不能在一个程序中同时存在,因为visual basic会报重复声明错
。我们知道,as any声明可使得任何参数都可以传递给dll函数,因此可以如下声明:
declarefunction loadcursor lib"user"(byval hinstance as integer ,_
byval lpcursorname as any )_
as integer
上述声明意味着visual basic能支持一个参数可接受多种类型的dll函数,然而这就
可能带来各种灾难性的后果,每当偶然情况下用不正确的参数调用该函数时,都可以引
发一个gpf,我们可以这样进行严格的类型检查并且帮助防止这类问题。
这种方法就是在函数的声明中使用alias技巧,看看下面的两个声明:
declarefunction loadcursorbyname lib"user"alias "loadcursor" _
(byval hinstance as integer,byval lpcursorname as string)_
as integer
declarefunction loadcursorbyid lib"user"alias "loadcursor" _
integer
declarefunction loadcursorbyid lib"user"alias "loadcursor" _
(byval hinstance as integer ,byvallpcursorname as long)_
as integer
loadcursorbyname用字符串做lpcursorname参数访问dll函数loadcursor, 而
loadcursorbyid访问同样的dll函数loadcursor,但是用长整型做lpcursorname参数,
这两个函数都对lpcursorname参数进行严格的类型检查,使visual basic能在调用dll函
数之前识别出不正确的变量类型,最大限度地减少引起gpf或者导致系统崩溃的机会。
除此之外,使用api函数时运行之前最好先存盘,仔细检查调用api函数的参数与声
明的类型是否一致,以及严格检查参数是否有效都能减少引发gpf或者系统崩溃。
--
※ 来源:·虎踞龙蟠 sbbs.seu.edu.cn·[FROM: 202.119.27.47]
完
--
以科计为本,以产业报国!
超越自我,飞跃无限!
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.249]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.183毫秒