2014-09-02 151 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

相關問題