2014-09-02 86 views
0

我正在从运行Access 2010的32位Office计算机编译我的Access数据库。我将作为.accdr文件进行部署以用于Access 2010 Runtime。我引用:将32位访问系统部署到64位Office计算机

VBE7.DLL

MSACC.OLB

STDOLE2.TLB

ACEDAO.DLL

EXCEL.EXE

msxml6.dll

我需要部署到一系列平台,包括64位2010年,2013年等。

因为部署的系统将使用Access 2010 Runtime,所以我认为大多数参考都没有问题。但是,Excel会给我一个问题。我曾试着注册Excel引用(实际上是所有引用,以防任何其他版本因机器而异),但似乎我无法从32位系统注册64位版本的Excel。或者我可以吗?

此外,如果我使用的是Runtime 2010,是否还需要更改API调用(使用PtrSafe关键字)?

这里有一些API调用我做的:

Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" 
    Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean 

Private Declare Function apiGetLocaleInfo Lib "kernel32" 
    Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long 

Private Declare Function LoadLibraryRegister Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName$) As Long 

Public Declare Function SetDllDirectoryA Lib "kernel32" (ByVal lpPathName As String) As Long 

Private Declare Function GetProcAddressRegister Lib "kernel32" Alias _ 
"GetProcAddress" (ByVal hModule&, ByVal lpProcName$) As Long 

Private Declare Function CreateThreadForRegister Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As Any, ByVal dwStackSize&, ByVal lpStartAddress&, ByVal lpparameter&, ByVal dwCreationFlags&, ThreadID&) As Long 
+0

你有没有听说过有条件的编译? – 2014-09-02 08:44:59

+0

是的,我开始学习所有关于#如果我们说的是Win64,但我仍不清楚是否可以从32位版本的Access注册64位版本的Excel。你能帮我吗? – 2014-09-02 09:52:03

回答

0

你需要确保代码能够在两个环境中运行。所以你可以像我一样使用条件编译。

我通常使用标准模块中的所有库调用。你应该能够做到这一点:

#If Win64 = 1 And VBA7 = 1 Then 
    Declare PtrSafe Function aht_apiGetOpenFileName Lib "comdlg32.dll" 
     Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean 

    Private Declare PtrSafe Function apiGetLocaleInfo Lib "kernel32" 
     Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long 

    Private Declare PtrSafe Function LoadLibraryRegister Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName$) As Long 

    Public Declare PtrSafe Function SetDllDirectoryA Lib "kernel32" (ByVal lpPathName As String) As Long 

    Private Declare PtrSafe Function GetProcAddressRegister Lib "kernel32" Alias _ 
    "GetProcAddress" (ByVal hModule&, ByVal lpProcName$) As Long 

    Private Declare PtrSafe Function CreateThreadForRegister Lib "kernel32" Alias _ 
    "CreateThread" (lpThreadAttributes As Any, ByVal dwStackSize&, ByVal lpStartAddress&, _ 
    ByVal lpparameter&, ByVal dwCreationFlags&, ThreadID&) As Long 
#Else 
    Declare Function aht_apiGetOpenFileName Lib "comdlg32.dll" 
     Alias "GetOpenFileNameA" (OFN As tagOPENFILENAME) As Boolean 

    Private Declare Function apiGetLocaleInfo Lib "kernel32" 
     Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long 

    Private Declare Function LoadLibraryRegister Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName$) As Long 

    Public Declare Function SetDllDirectoryA Lib "kernel32" (ByVal lpPathName As String) As Long 

    Private Declare Function GetProcAddressRegister Lib "kernel32" Alias _ 
    "GetProcAddress" (ByVal hModule&, ByVal lpProcName$) As Long 

    Private Declare Function CreateThreadForRegister Lib "kernel32" Alias _ 
    "CreateThread" (lpThreadAttributes As Any, ByVal dwStackSize&, ByVal lpStartAddress&, _ 
    ByVal lpparameter&, ByVal dwCreationFlags&, ThreadID&) As Long 
#End If 
+0

感谢您的回复Paul,这正是我所做的,但在我在64位机器上测试之前,我需要确保以下内容: 我可以注册原始文章中列出的参考文献(大多数特别是Excel)与我注册32位的一样? 我这么谨慎的原因是我在一个月前在我的老板的机器上测试过它(在我实施条件编译之前),它把事情搞得非常糟糕,以至于他不得不彻底重新安装! – 2014-09-03 07:05:33

+0

如果DLL是32位:将DLL复制到'C:\ Windows \ SysWoW64 \\'然后在提升的命令提示符下:'%windir%\ SysWoW64 \ regsvr32.exe%windir%\ SysWoW64 \ namedll.dll' 如果DLL是64位,则为 :将DLL复制到'C:\ Windows \ System32 \\'。然后在提升的命令提示符下:'%windir%\ System32 \ regsvr32.exe%windir%\ System32 \ namedll.dll' – PaulFrancis 2014-09-03 09:23:01

+0

谢谢Paul,我一定会试试! – 2014-09-08 05:38:33

相关问题