VB中调用WindowsAPI的注意事项
API说到底是一系列底层功能,是系统提供给用户访问操作系统核心进行高级编程的方式。通过在Visual Basic应用程序中声明外部过程,可以访问Windows API(和其他外部dll)。过程声明后,调用它的方法和调用Visual Basic自己的过程是一样的。
作为一个高效的编程环境,Visual Basic (VB)封装了一些Windows API函数,但也牺牲了一些API函数。在调用API时稍有不慎,就可能导致API编程错误、难以捕获或间歇性错误,甚至程序崩溃。为减少API编程错误,提高VB调用API的安全性,应注意以下八个问题:
(1)指定“选项显式”
编程前,在VB编程环境中选择“需要变量声明”。如果未指定此项,任何简单的输入错误都可能导致“变量”变量。调用API时,VB会对变量进行强制转换以避免冲突。因此,VB将为各种类型(如字符串、长整数、整数、浮点数等)传递空值。,导致程序无法正常运行。
(2)注意VB整数和Win32整数的区别。
在VB环境下,涉及到的整数都是16位,但是一旦涉及到C/C++Win32文档,就是32位了。在阅读与Windows API函数或32位动态链接库相关的资料或应用时,要特别注意分析和理解环境背景,以便区分数据类型和数据结构,正确声明API函数。
(3)尽量减少和避免使用
虽然用As Any方法声明库可以让Windows API函数接受各种类型的参数,但更严重的是,即使是很小的错误,比如缺少类型标识符或者错误地使用ByVal关键字,也可能导致系统崩溃或者其他难以发现的数据错误。
(4)注意检查参数类型。
除了因缺少ByVal关键字而导致的错误之外,大约50%的API错误是由于声明中不正确的参数类型造成的。在Win32环境下,无论是8位、16位还是32位的数值变量都以32位传递,如果同时使用,很难发现错误。如果声明的参数类型不一样,VB把它当作一个变量传递给API函数,就会出现“错误的DLL调用规范”的消息。
(5)别忘了ByVal,保证函数声明的完整性。
ByVal按值调用。当传递参数时,指向DLL的指针不会传递给参数变量本身,而是将传递的参数值的副本传递给DLL。例如,在传递字符串参数时,VB和DLL之间的接口支持两种类型的字符串。如果不使用ByVal关键字,VB会将指向DLL的函数指针传递给一个OLE2.0字符串(即BSTR数据类型),而Windows API函数往往不支持这种数据类型,从而导致错误。使用ByVal关键字后,VB将字符串转换成C语言格式的“空 termination”字符串,API正确使用。
(6)重新检查函数名。
在Win16环境下,API函数的名称不需要区分大小写,而在Win32环境下,则需要区分大小写。当在DLL函数中找不到声明的函数时,有必要检查函数的名称。对于管理字符串的函数,是否缺少a和w前缀。
(7)提前初始化字符串,避免冲突。
如果API函数需要一个指向缓冲区的指针,以便从缓冲区加载数据,并且传递了字符串变量,则应该首先初始化字符串长度。因为API无法知道字符串的长度——默认情况下API已经为其分配了足够的长度。没有初始化字符串,分配给字符串的缓冲区可能会不够用,API函数可能会在缓冲区的末尾反复重写,内存中字符串后面的内容也会被重写的乱七八糟。程序显示为突然终止或间歇性错误。
(8)跟踪和检查参数、返回类型和返回值。
VB有即时模式和单步调试功能。利用这个优势,我们可以保证函数声明的类型是明确的(API不返回Variant类型)。通过跟踪检查参数的来源和类型,可以消除参数的错误传递。许多API函数都有返回结果,表明它们是否已经成功执行。如果要测试返回的结果,可以使用VB的ERR对象的lastDLErrOR方法来查阅这些信息。对于错误,可以调用API函数,检索API函数GetlastError的结果,修改语句,达到正确调用API函数的目的。
0条评论