VB中访问API函数之防错技巧
强大的API(应用程序接口)函数对于VB(Visual Basic For Windows)程序员来说是一个很好的编程工具,但是使用API函数的程序员可能都会遇到这种现象。在VB集成环境中,程序运行后,会出现一个错误信息对话框。按下OK键后,系统会自动退出VB集成环境。这个时候,如果你的程序还没有保存下来,那就太可惜了,太无力挽回损失了。上次保存后的程序不再存在。这是由于您不正确使用API函数而导致的一般保护失败(GPF)。
当GPF错误发生时,应该允许Windows关闭应用程序。在某些情况下,您可能需要退出Windows或重新启动系统。错误的程度取决于记忆被破坏的位置。DLL(动态链接库)函数中的类型不一致等错误是GPF错误的主要原因。这些错误会导致GPF,甚至使Windows系统完全崩溃(需要重新启动)。这里有一些避免GPF的建议。
使用别名提供强类型检查是避免GPF的有效措施之一。在某些情况下,DLL函数可以接受多种类型。LoadCursor函数就是这样一个例子,其定义如下:
HCURSOR LoadCursor(hInstance,lpCursorName)
这里,HCURSOR是指向游标对象的16位句柄,bit instance是16位实例句柄,lpCursorName是游标的名称或游标资源的32位整数ID。支持两种类型的lpCursorName参数。VB有必要包含以下两条语句:
将函数LoadCursorLib " USER "(ByVal h instance为整数,Byval LP游标名称为字符串)声明为整数,并将函数LoadCursorLib"USER"(ByVal提示为整数,byval LP游标名称为long)声明为整数。
但是,这两个声明不能同时存在于一个程序中,因为Visual Basic会报告重复声明错误。我们知道,由于任何声明都可以使任何参数传递给DLL函数,所以可以声明如下:
将函数load cursor Lib“USER”(ByVal hin instance为整数,ByVal lpCursorName为任意)声明为整数
上面的语句意味着Visual Basic可以支持一个带有一个参数的DLL函数,该函数可以接受多种类型。但是,这可能会带来各种灾难性的后果。在意外情况下,只要使用不正确的参数调用该函数,就会触发GPF。我们可以进行严格的类型检查,并帮助防止此类问题。
这个方法是在函数声明中使用别名技术。看看下面两个声明:
将函数LoadCursorByName lib"USER "别名" LoadCursor"(ByVal hInstance为整数,Byval LP游标名称为字符串)声明为整数,并将函数load cursor
声明为整数。
LoadCursorByName使用string作为lpCursorName参数来访问DLL函数LoadCursor,而LoadCursorByID访问相同的DLL函数LoadCursor,但是使用long integer作为lpCursorName参数。这两个函数都严格检查lpCursorName参数的类型。Visual Basic可以在调用DLL函数之前识别不正确的变量类型,并将导致GPF或系统崩溃的可能性降至最低。
另外,运行前保存API函数,仔细检查调用API函数的参数是否与声明的类型一致,严格检查参数是否有效,可以减少GPF或系统崩溃。
位律师回复
0条评论