发信人: winsy(鹰派)
整理人: winsy(2003-04-29 10:35:57), 站内信件
|
VB中API调用的探讨
——如何实现类似VC中API使用的无缝连接?
作者:Belfry
众所周知,在VB中,API得声明调用,为此,你还得使用其他软件来辅助生成声明语句,
如用VB自带的APIViewer。通常,你在开始编程之前,并不能完全了解你将使用到哪些A
PI函数、类型、常数,往往是一边往下编程,才一边产生需要,所以,一个程序下来,
要多次使用API浏览器来产生声明,而且有的时候,由于声明的太多,会造成重复声明、
私有和公有冲突等问题。如何来解决这个问题,相信所有的编程爱好者都曾经思考过,
也许都有自己的思路,但真正完全解决的,如VC使用API之方便者,大概未曾有过。这也
是VB这个编程环境本身特点所决定的。
真的没有办法解决吗?如果以辨证思维的角度来说,问题的解决在一定的程度内是可能
的。解决也只能是一定范围内或一定程度的解决。不管如何,百家争鸣才有百花齐放。
笔者将结合自己的经验,在此探讨解决办法。
解决办法一:借鉴VC经验,把所有API声明制作成包含文件,每次需要使用API的时候,
把声明加入工程。例如,现在网上也经常见到的包含文件如User32.bas、Shell32.bas等
等,分别把各大系统dll函数声明制作成标准模块,供需要时调用。但这一解决办法的缺
点是显而易见的,在VC中,由于API的声明是采用链接形式的,在编译的时候并不把整个
声明都包含进来,而是就使用到的API声明包含进来,而VB中不同,VB中的bas模块是整
个被编译进可执行程序的,所以加入工程后,由于模块的大小太大,将出现严重数据冗
余;同时由于仍需要手动添加模块,使用起来方便性改善不大。所以,使用此法的人不
太多,仅适用于需要大量使用API的编程人员。
解决办法二:控件。使用控件的方式,如果控件编制的好,则使用起来比较方便,如有
的控件除了提供标准调用外,还有经过整合的特殊功能,而有些控件为了追求个人的“
特色”,把函数名进行了更改,如改成中文名称或在函数名前增加特定前缀等。使用控
件本身有其缺点,如需要注册,如果是他人的控件,还涉及到版权问题、升级问题等,
同时如果发布程序,则需要把控件一起打包,于是就会增加软件的大小。
解决办法三(独创):辅助设计方式。这种方式只需要一次设置,一劳永逸,而且,该
方式只是提供辅助设计自动生成API声明,使编程人员专注于程序设计,而无须考虑API
声明的烦琐,在最后的工程中不包含任何额外的附件(冗余的包含模块、控件)等,真
正实现了“无缝调用,按需生成”的效果。
在辅助设计方式中,需要使用两个工具:一个声明预定义体(ActiveX Dll)、一个辅助
声明生成工具(IDE Add-In)。声明预定义体实现API调用的无缝连接,下面的代码示例
说明了其作用:
Private mIUser As New IUser32’IUser32是声明预定义体定义的接口类
...
Private Sub Form_...()
mIUser.SendMessage Me.hWnd, WM_CLOSE,0,0 '调用预定义好的API,其中WM_CLOSE也是
预定义的。
End Sub
...
在上面的示例中,首先声明了一个预定义体接口对象,然后在代码的某个部位调用API,
调用时只需输入该接口对象变量(本例中为mIUser),再输入一个点“.”,即可实现弹
出函数列表,选择函数“SendMessage”后再按空格,就会出现如VB本身函数一样的参数
列表。
辅助声明生成工具的作用是在最后工程发布的时候把所有使用到的函数(包括常数、类
型等)声明自动添加到工程,同时把所有API接口变量去掉,实现如同普通使用API一样
,声明、调用,但所不同的是,我们省略了所有的自己声明函数的烦琐。该工具通过搜
索程序代码中所有使用接口变量的API调用,从而获得一个所使用的API函数的列表,生
成声明,并替换掉原来依赖API接口变量产生的API调用。具体来说,经过该工具后,上
面的代码就会变成:
Private Declare Function SendMessage Lib “User32” Alias “SendMessageA” (
ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam A
s Long) As Long
...
Private Sub Form_...()
SendMessage Me.hWnd, WM_CLOSE,0,0 '正常调用API
End Sub
...
该方式的缺点是仍需要进行一次设置,并且需要在代码中使用接口变量进行调用,最后
运行一次辅助生成声明程序。但其优点是明显的:一是其实现了API的方便调用,二是其
实现了“不对代码及目标程序产生任何不必要的附加物”的目的。
(本文版权归作者所有,如需要转载,请联系作者本人,联系方式:Xie_Xiaoshan@163
.com) |
|