在32位VBA环境中,许多API回调函数,都需要用AddressOf函数来获取被调用函数的地址。当把这样的代码移植到64位VBA环境中,在运行时往往提示“编译错误:类型不匹配”。本贴通过一个实例来介绍如何解决这种问题。
实例来源于我的另一个主题帖子里提供的一个获取窗口信息的小工具。这个小工具,通过一个枚举窗口句柄的回调函数,对每个被枚举出来的窗口句柄,获取其窗口的类名、标题、位置、大小等信息。
其中,为了给被调用的函数传递枚举出来的窗口句柄,需要用到AddressOf函数来获取被调用函数的地址。
当时,我用的是32位的EXCEL,所以这个小工具的代码也是32位的。这次,我把这个小工具拿出来用,但是我的EXCEL已经换成64位的了,于是,先简单地把声明部分的API函数中的“Declare”替换成“Declare PtrSafe”,这一步是必须的。然后直接运行其中的程序,就弹出如下图的错误提示。
现在,我来介绍一下解决这个问题的过程步骤:
第1步、在弹出的错误提示对话框中,点"确定"按钮,自动定位到了出错的语句,观察到出错的AddressOf函数,是作为API函数EnumChildWindows的第2个参数来调用的,
第2步、于是按"Ctrl+F"快捷键打开“查找”对话框,通过查找"EnumChildWindows",快速定位到声明中的API函数EnumChildWindows,
第3步、由第1步已知,出错的AddressOf,对应的是该API函数的第2个参数,因此把这个参数的类型,由"long"改为"LongPtr"。
再次运行程序,此处AddressOf就不再弹出错误提示了,这表明已经修复成功。
此外,在代码移植时,通常还要考虑向旧版兼容,这就需要用条件编译语句#IF...#Else...#End来解决了,本实例附件中也有演示,因此可以兼容64位和32位的Office版本,方法比较简单,因此本帖就不多说了。
Windows窗口信息获取的小工具.rar
(35.45 KB, 下载次数: 398)
|