功能强大的api(应用程序接口)函数对于vb(visual basic for windows)程序员来说,不愧是很好的编程工具,然而使用api函数的程序员也许都遇到这样的现象。在vb集成环境下,程序运行后,出现一错误信息对话框,按确定键后系统自动退出vb集成环境,此时如果你的程序尚未存盘,那末很遗憾挽回损失已回天乏力。最后一次存盘之后的程序都不复存在。这是你对api函数使用不当引起的一般保护故障(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有必要包含如下两个声明:
declare function loadcursorlib"user"(byval hinstance as integer,byval lpcursorname as string)as integer和
declare function loadcursor lib"user"(byval hinstance as integer,byval lpcursorname as long)as integer
但是,这两个声明不能在一个程序中同时存在,因为visual basic会报重复声明错。我们知道,as any声明可使得任何参数都可以传递给dll函数,因此可以如下声明:
declare function loadcursor lib"user"(byval hinstance as integer ,byval lpcursorname as any )as integer
上述声明意味着visual basic能支持一个参数可接受多种类型的dll函数,然而这就可能带来各种灾难性的后果,每当偶然情况下用不正确的参数调用该函数时,都可以引发一个gpf,我们可以这样进行严格的类型检查并且帮助防止这类问题。
这种方法就是在函数的声明中使用alias技巧,看看下面的两个声明:
declare function loadcursorbyname lib"user"alias "loadcursor"(byval hinstance as integer,byval lpcursorname as string)as integer和
declare function loadcursorbyid lib"user"alias "loadcursor"(byval hinstance as integer ,byval lpcursorname as long)as integer
loadcursorbyname用字符串做lpcursorname参数访问dll函数loadcursor, 而loadcursorbyid访问同样的dll函数loadcursor,但是用长整型做lpcursorname参数,这两个函数都对lpcursorname参数进行严格的类型检查,使visual basic能在调用dll函数之前识别出不正确的变量类型,最大限度地减少引起gpf或者导致系统崩溃的机会。
除此之外,使用api函数时运行之前最好先存盘,仔细检查调用api函数的参数与声明的类型是否一致,以及严格检查参数是否有效都能减少引发gpf或者系统崩溃。