设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 8384|回复: 13
打印 上一主题 下一主题

[窗体] 数据库设置工具V2.0-无法在64位下使用(笨办法解决)

[复制链接]
跳转到指定楼层
1#
发表于 2012-1-29 14:07:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 大连海员 于 2012-1-30 09:09 编辑

大家好,以前曾经下载了“李寻欢”提供的“数据库设置工具V2.0”,使用起来非常顺手,也一直在使用。

但现在电脑换新,新装了64位WIN7,2010版OFFICE,结果这个工具不能使用了,在打开时,提示:
“若要在 64 位系统上使用,则必须更新此项目中的代码。请检查并更新 Declare 语句,然后用 PtrSafe 属性标记它们”

我不会在语句中进行修改,不知是否有高手愿意帮忙修改一下,下面是出现提示后自动展开的语句部分:
Option Compare Database
Public Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As String
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As String
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As String
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2012-1-29 14:09:59 | 只看该作者
呵呵,没有64位系统无法对你进行帮助,顶一个吧
3#
发表于 2012-1-29 15:36:12 | 只看该作者
帮顶,没用过64位的
建议把comdlg32.dll改成comdlg64.dll试试.
有可能兼容{:soso_e120:}
4#
发表于 2012-1-29 15:38:32 | 只看该作者
PtrSafe應該放在public之後應該可以了.還有64位window是向下兼容的.應該在syswow64那裡註冊你的鏈接庫文件就可以了.
5#
 楼主| 发表于 2012-1-29 15:59:25 | 只看该作者
谢谢楼上三位的回复。

“建议把comdlg32.dll改成comdlg64.dll试试.”此法在发贴之前已试过,无效。

Ptrsafe语句我不会使用,能否麻烦哪位帮我修改一下上面的例句;在syswow64那里注册我也不懂,可否再说详细一些。
6#
 楼主| 发表于 2012-1-29 16:24:02 | 只看该作者
刚才在网上学习了一会,发现Ptrsafe是要加到Declare后面的,一共有三个还是四个地方跳出来,均照此修改,结果在启动和点击应用时,就不再跳出错误的提示框了。

不过新的问题出来了,就是工具是正常启动、出现,并且在点击时也不再跳出错误提示框了,但原来上面点击“选择文件”的按钮时,没有了任何反应,由于没有办法指向文件,因此工具仍然不可使用。

看哪位高手能够帮助解决一下。
7#
发表于 2012-1-29 18:34:59 | 只看该作者
大哥,64位的office不好玩,很多控件都不能正常支持的,我以前也是用的64位,後來很多毛病,有用回32位的了.你windows7如果是64位的話,也是可以兼容32位的office的,建議你改回用32位的office吧.
8#
 楼主| 发表于 2012-1-29 19:11:11 | 只看该作者
JosephTan 发表于 2012-1-29 18:34
大哥,64位的office不好玩,很多控件都不能正常支持的,我以前也是用的64位,後來很多毛病,有用回32位的了.你wi ...

谢谢你的回复,我的WIN7是64位的,目前用OFFICE和其它应用程序都还挺好的。不过我还真没有考虑到OFFICE也可以用32位的,当时一门心思就想着用64位的了,只要有64位的程序,就都没有考虑过装32位的。

你的建议很好,如果我解决不了这个问题的话,很可能会考虑装回32位的OFFICE。
9#
发表于 2012-1-29 20:01:26 | 只看该作者
帮助文件上的,希望能帮助到你

64 位 Visual Basic for Applications 概述


Microsoft Visual Basic for Applications (VBA) 是 Microsoft Office 附带的 Visual Basic 版本。在 Microsoft Office 2010 中,VBA 包括可使 VBA 代码同时在 32 位和 64 位环境中正确运行的语言功能。


注意:默认情况下,Office 2010 安装 32 位版本。在安装过程中,您必须明确选择安装 64 位版本。



对于在 Office 2010 版本之前(VBA 版本 6 和更早版本)编写的 VBA 代码,需要修改为在 64 位 Office 版本中运行,否则在 64 位平台上运行时会导致错误。这是因为,VBA 版本 6 和更早版本完全以 32 位平台为目标,而且通常包含 Declare 语句,这些语句调用的 Windows API 使用 32 位数据类型的指针和句柄。因为 VBA 版本 6 和更早版本没有用于指针或句柄的特定数据类型,所以,它使用 Long 数据类型(一种 32 位 4 字节的数据类型)来引用指针和句柄。64 位环境中的指针和句柄为 8 字节 64 位数。这些 64 位数不能包含在 32 位数据类型中。



注意:只有在 64 位版本的 Microsoft Office 中运行 VBA 代码时,才需要修改 VBA 代码。



在 64 位 Office 中运行旧 VBA 代码的问题在于,将 64 位加载到 32 位数据类型中会截断 64 位数。这会导致内存溢出、代码中出现意外结果,并且可能导致应用程序故障。

为解决此问题,以使 VBA 代码能同时在 32 位和 64 位环境中正确运行,新版 VBA 中增加了几项语言功能。此文档底部的表总结了这些新的 VBA 语言功能。有三个重要的新增功能,分别是:LongPtr 类型别名、LongLong 数据类型和 PtrSafe 关键字。




LongPtr - 现在,VBA 包括一种可变类型别名:LongPtr。LongPtr 实际解析为哪种数据类型取决于它在哪种 Office 版本中运行:在 32 位版本的 Office 中 LongPtr 解析为 Long,在 64 位版本的 Office 中 LongPtr 解析为 LongLong。LongPtr 用于指针和句柄。
LongLong - LongLong 数据类型为有符号的 64 位整数,仅在 64 位版本的 Office 中可用。LongLong 用于 64 位整数。必须使用转换函数将 LongLong(包括 64 位平台上的 LongPtr)显式赋予较小的整型。不允许将 LongLong 隐式转换为较小的整数。
PtrSafe - PtrSafe 关键字声明 Declare 语句可以在 64 位版本的 Office 中安全运行。
现在,在 64 位版本的 Office 中运行时,所有 Declare 语句必须都包括 PtrSafe 关键字。必须理解,仅仅将 PtrSafe 关键字添加到 Declare 语句中只是表示 Declare 语句显式针对 64 位,而语句中需要存储 64 位(包括返回值和参数)的所有数据类型仍须经过修改才能保存 64 位数。



注意:带有 PtrSafe 关键字的 Declare 语句为建议的语法。包括 PtrSafe 的 Declare 语句可同时在 32 位和 64 位平台上的 VBA7 开发环境中正确工作。为确保在 VBA7 中以及更早版本中的向后兼容性,请使用下面的构造:


#If Vba7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf


请考虑下列 Declare 语句示例。在 64 位版本的 Office 中运行未经修改的 Declare 语句会导致一个错误,该错误指出 Declare 语句未包括 PtrSafe 限定符。修改后的 VBA 示例中包含 PtrSafe 限定符,但请注意,返回值(指向活动窗口的一个指针)返回 Long 数据类型。在 64 位 Office 上,这是错误的,因为指针应为 64 位。PtrSafe 限定符告知编译器 Declare 语句针对 64 位,因此该语句可以正常执行。但是返回值没有更新为 64 位数据类型,因此被截断,从而返回错误的值。



未修改的旧 VBA Declare 语句示例:


Declare Function GetActiveWindow Lib "user32" () As Long



修改后的 VBA Declare 语句示例,其中包括 PtrSafe 限定符,但仍使用 32 位返回值:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long



再次重申,您除了必须修改 Declare 语句来包括 PtrSafe 限定符外,还必须更新语句中所有需要保存 64 位数的变量,以便这些变量使用 64 位数据类型。

修改后的 VBA Declare 语句示例,其中包括 PtrSafe 关键字,并且更新为使用正确的 64 位 (LongPtr) 数据类型:

Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr



总而言之,对于要在 64 位版本的 Office 中运行的代码,您需要找到并修改所有现有 Declare 语句以使用 PtrSafe 限定符。同时,还需要找到并修改这些 Declare 语句内所有引用句柄或指针的数据类型以使用新的 64 位兼容的 LongPtr 类型别名,并且需要使用新的 LongLong 数据类型保存 64 位整数的类型。此外,还必须更新任何包含指针或句柄以及 64 位整数的用户定义类型 (UDT),使之使用 64 位数据类型,同时,必须验证所有变量赋值是否正确,以防止发生类型不匹配错误。

编写可同时在 32 位和 64 位 Office 上运行的代码
若要编写可同时在 32 位和 64 位版本的 Office 上运行的代码,只需对所有指针和句柄值使用新的 LongPtr 类型别名来代替 Long 或 LongLong 即可。LongPtr 类型别名将解析为正确的 Long 或 LongLong 数据类型,具体取决于运行的是哪种 Office 版本。请注意,如果您需要执行不同的逻辑(例如,您需要在大型 Microsoft Excel 项目中使用 64 位值),可以使用 Win64 条件编译常量,如下面一节所示。

编写可同时在 Microsoft Office 2010(32 位或 64 位)以及以前版本的 Office 上运行的代码
若要编写可同时在新版本和旧版本的 Office 中运行的代码,可以使用新的 VBA7 与 Win64 条件编译器常量的组合。Vba7 条件编译器常量用来判断代码是否在 VB 编辑器版本 7(Office 2010 附带的 VBA 版本)中运行。Win64 条件编译常量用于判断正在运行哪种 Office 版本(32 位还是 64 位)。

#if Vba7 then
'  代码正在新 VBA7 编辑器中运行
#if Win64 then
'  代码正在 64 位版本的 Microsoft Office 中运行
#else
'  代码正在 32 位版本的 Microsoft Office 中运行
#end if
#else
' 代码正在 VBA 版本 6 或更早版本中运行
#end if



#If Vba7 Then
Declare PtrSafe Sub...
#Else
Declare Sub...
#EndIf





VBA7 语言更新总结
下表总结了新增的 VBA 语言功能,并给出每个新增功能的解释:



名称 类型 描述
PtrSafe  关键字 声明 Declare 语句针对 64 位系统。在 64 位上是必需的。
LongPtr 数据类型 该类型别名映射为 32 位系统上的 Long,或 64 位系统上的 LongLong。
LongLong 数据类型 8 字节的数据类型,只在 64 位系统上可用。数字类型。-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 范围内的整数。LongLong 只是 64 位平台上的有效声明类型。此外,不能将 LongLong 隐式转换为较小的类型(例如,不能将 LongLong 赋予 Long)。这样做的目的是防止不慎将指针截断。允许显式强制转换,所以在上例中,可以将 CLng 应用于 LongLong,并将结果赋予 Long。(只在 64 位平台上有效。)
^ LongLong 类型声明字符 显式将文字值声明为 LongLong。声明大于最大 Long 值的 LongLong 文字时是必需的(否则它将隐式转换为 double)。
CLngPtr 类型转换函数 将简单表达式转换为 LongPtr。
CLngLng 类型转换函数 将简单表达式转换为 LongLong 数据类型。(只在 64 位平台上有效。)
vbLongLong VarType 常量 VarType 常量。
DefLngPtr DefType 语句 将一系列变量的默认数据类型设置为 LongPtr。
DefLngLng DefType 语句 将一系列变量的默认数据类型设置为 LongLong。
10#
发表于 2012-1-29 21:02:38 | 只看该作者
谢谢 Grant 提供宝贵经验
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-29 04:29 , Processed in 0.096295 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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