在VB中调用Windows API的注意事项
[入库:2005年8月18日] [更新:2007年3月25日]
在vb中调用windows api的注意事项 朱运喜 |
01-4-29 上午 11:17:21
|
| visual basic (vb)作为一种高效编程环境,它封装了部分windows api函数,但也牺牲了一些api的功能。调用api时稍有不慎就可能导致api编程错误,出现难于捕获或间歇性错误,甚至出现程序崩溃。要减少api编程错误,提高vb调用api时的安全性,应重点注意下列八个问题: |
| 编程前最好将vb编程环境中的“require variable declaration(要求变量申明)项选中。如果该项未被指定,任何简单的录入错误都可能会产生一个“variant”变量,在调用api时,vb对该变量进行强制转换以避免冲突,这样一来,vb就会为字符串、长整数、整数、浮点数等各种类型传递null值,导致程序无法正常运行。 |
| 在vb环境下,涉及到的所有integer(整型数),都是16位,而一旦涉及c/c++win32文档时,则是32位,阅读与windows api函数或与32位动态链接库有关的资料或应用程序时,尤其要注意分析理解环境背景,以利于分清数据类型和数据结构,正确地声明api函数。 |
| 虽然用as any的方法声明库,可使windows api函数能接受多种类型的参数,但更严重的是,即使是一个很小的错误,比如遗漏类型标识符或错误地使用了byval关键字,都可能导致系统崩溃或很难发现的其他数据错误。 |
| api错误中,除了因遗漏byval关键字导致的错误外,大约有50%是因为声明中有不正确的参数类型。在win32环境下,无论是8位、16位,还是32位数值变量都是以32位传递,如果同时使用,则很难发现其中错误。如果声明的参数类型不同,被vb视为variant传递给api函数,会出现“错误的dll调用规范”的消息。 |
| byval是“按值”调用,参数传递时,不将指向dll的指针传递给参数变量本身,而是将传递参数值的一份拷贝传递给dll。比如传递字符串参数时,vb与dll之间的接口支持两种类型的字符串,如未使用byval关键字,vb将指向dll的函数指针传递给一个ole2.0字符串(即bstr数据类型),而windows api函数往往不支持这种数据类型,导致错误。而使用byval关键字后vb将字符串转变换成c语言格式的“空终止”串,被api正确使用。 |
| 在win16环境下,api函数的名字不要求区分大小写,而在win32环境下,则有此要求。在一个dll函数里找不到声明的函数时,有必要检查一下函数名,对于管理字符串的函数,是否遗漏了a和w前缀。 |
| 如果api函数要求一个指向缓冲区的指针,以便从中载入数据,而此时传递的是字符串变量,应该先初始化字符串长度。因为api无法知道字符串的长度——api默认已为其分配有足够的长度。没有初始化字符串,分配给字符串的缓冲区有可能会不足,api函数将有可能在缓冲区末尾反复改写,内存里字符串后面的内容将会改写得一塌糊涂。程序表现为突然终止或间歇性错误。 |
| vb具有立即模式和单步调试功能,利用这个优势,确保函数声明的类型明确(api不返回variant类型),通过跟踪和检查参数的来源及类型,可以排除参数的错误传递。许多api函数都有返回结果,指出自己是否执行成功。你若要对返回结果进行测试,用vb的err对象的lastdllerror方法可查阅这些信息,对错误可针对api函数调用,取回api函数getlasterror的结果,以修改声明,达到正确调用api函数之目的。 |
本文关键:api,vb
本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)