设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3208|回复: 3
打印 上一主题 下一主题

[模块/函数] 【原创】Office32位和Office64位 编程注意事项

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2015-6-25 17:01:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 盗梦 于 2015-6-25 17:21 编辑

Office32位和Office64位表面上没有什么区别。
实际上,在vba方面要注意的是API和个别函数的使用。(该vba包括 Access vba,Excel vba,Word vba,PPT vba等)

以下是我最近写代码发现并总结出来的。

首先,说说API。
例如,在Office32位中API是这样声明的:
  1. Private Declare Function GetModuleHandleA Lib "kernel32"  _
  2.                                (ByVal lpModuleName As String) As Long
复制代码
而在Office64位需要在 Function 或者 Sub 前面加一个关键字,PtrSafe :
  1. Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32"  _
  2.                                (ByVal lpModuleName As String) As Long
复制代码

PtrSafe 是 “指针安全” 的意思,到了64位,受影响最大的就是指针。
你可能会跳出了说vba没有指针。
实际上很多API函数是由C/C++编写的,内部实现机制有些会用到指针。

当然,同样的代码,你不想写两个文件,可以这么做:
  1. #If  vba7  Then
  2.        '64位的代码
  3.        Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32"  _
  4.                                (ByVal lpModuleName As String) As Long
  5. #Else
  6.        '32位的代码
  7.        Private Declare Function GetModuleHandleA Lib "kernel32"  _
  8.                                (ByVal lpModuleName As String) As Long
  9. #End If
复制代码

这个披上 # 号的 条件结构 叫作 “条件编译”,也就是系统在编译的时候就去判断里面的条件,选择性编译。
这样处理就可以实现32位Office和64位Office 代码兼容问题。

除此之外,还有3点要注意:
1、 AddressOf 函数
      在32位Office中,AddressOf 函数返回的类型是 Long;
      而在64位Office中,将返回 LongPtr 类型。这个类型也是一种指针类型。
      所以,调试编辑的时候,提示AddressOf 类型不符合的时候,就是返回的类型和你API函数的参数类型不一致。这是只需要把API函数对应的变量类型改为 LongPtr 即可。

2、VarPtr函数,ObjPtr函数,StrPtr函数
     这三个函数也是同样的道理,在64位将返回 LongPtr类型。

3、部分属性也要注意
      像 Application.Hinstance ,在64位Office要用 Application.HinstancePtr 才不会出错。
      这种在64位vba写代码时候,代码提示发现有一个一样的属性名,但这个属性名后面跟着 Ptr 后缀,不用看了,用它就没错了。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2015-6-25 17:09:59 | 只看该作者
之前试过,复制32位的api声明到64位的文件里(例如将),系统会报错,要求加上关键字。

点击这里给我发消息

3#
 楼主| 发表于 2015-6-25 17:11:08 | 只看该作者
roych 发表于 2015-6-25 17:09
之前试过,复制32位的api声明到64位的文件里(例如将),系统会报错,要求加上关键字。

现在有些人用上了 64位 Office了,而且将会越来越多,所以兼容性问题不得不考虑
4#
发表于 2015-6-26 14:25:43 | 只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 02:07 , Processed in 0.088687 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表