mccad 发表于 2013-8-16 18:39:29

VBA兼容64位系统的问题(一)Declear声明无法正常运行问题

近期由于操作系统升级到64位,同时试用AutoCAD2014版本,原来的一些VBA程序运行上出了一些问题:

1) Declear声明语句无法正常运行。
    查了一些资料,发现可以使用Declare PtrSafe来代替原来的Declear以解决这个问题。如原来32位的:
Private Declare Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean
在64位系统中,需要写成:
Private Declare PtrSafe Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean

这样问题好象解决了,其实问题还没有解决,因为怎样让同一程序能够在32位系统和64位系统中兼容又是个问题。
当然,最终还是找到方法:#If VBA7 Then
Private Declare PtrSafe Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean
#Else
Private Declare Function acedSetColorDialog Lib _
   "acad.exe" (color As Long, ByVal bAllowMetaColor _
   As Boolean, ByVal nCurLayerColor As Long) As Boolean
#End If
我们可以看到,这里用了一个系统变量“VBA7”,通过这个变量可以辨别VBA系统是否为VBA7,并通过这个判断来加载不同的语句。另外还有一个变量是“WIN64”,这个变量可以辨别系统是否为WIN64位系统,并通过它来加载不同的语句。

为什么这里用了VBA7而不是用WIN64变量呢,那是因为在2014版以前,虽然是Win64系统,但实际上VBA还是32位系统,Declear声明并不需要加上PtrSaft,所以通过VBA7来着判断会更为准确。

有个不完美的地方是,VBA7中对于没有加入PtrSaft的Declear的代码都标注为有误并显示红色,不过还好,显示归显示,运行还是给运行的,因为通过前面的判断语句,那句错误的语句并不会运行到,所以运行时不会出错。
以上解决方法具体说明链接:http://bbs.mjtd.com/thread-100890-1-1.html

2) 数据库连接ADO以及DAO方式都无法使用。
这项问题到目前找不到解决方案,还在找,不过象我的那个塑料公差标注程序,原来用了ACCESS数据库,由于VBA7是真64位,那些32位的数据库连接方式都彻底失效,而微软又没有针对64位出数据库连接方式(目前还未搜索到),所以只能改成非数据库方式运行,把数据全部变成字符串并通过split转成数组保存并在程序中定位调用,由于数据量少,影响不大。
等找到方法解决后,再跟大家分享。




http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 mccad的微博

ps122hb 发表于 2013-8-17 06:46:09

好资料,多谢分享

流星蔡园 发表于 2015-9-26 10:50:23

VBA这样解决好了,VB怎么解决?
页: [1]
查看完整版本: VBA兼容64位系统的问题(一)Declear声明无法正常运行问题