中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
32位和64位版本的Office 2010之間的兼容性

摘要:針對(duì)處理大量數(shù)據(jù)的客戶,Microsoft 推出了 64 位版本的 Microsoft Office 2010。本文討論有關(guān) 32 位版本與新的 64 位版本和舊的 32 位 Office 應(yīng)用程序之間兼容性的問(wèn)題,并提供了相應(yīng)的解決方案。(12 個(gè)打印頁(yè))

Microsoft Office 2010 system 同時(shí)具有 32 位和 64 位版本。64 位版本使您能夠處理更大的數(shù)據(jù)集。如果要在 Microsoft Excel 2010 中處理大量數(shù)字,則尤其需要使用此版本。

隨著新的 64 位版本 Microsoft Office 2010 的引入,Microsoft 發(fā)布了稱為 Microsoft Visual Basic for Applications 7.0 (VBA 7) 的新版本的 Microsoft Visual Basic for Applications (VBA) 以同時(shí)處理 32 位和 64 位應(yīng)用程序。需要特別注意的是,本文中介紹的更改只適用于 64 位版本的 Microsoft Office 2010。如果使用的是 32 位版本的 Office 2010,則可以不加修改地使用以前版本的 Microsoft Office 中內(nèi)置的解決方案。

注釋

在安裝 Office 2010 時(shí),默認(rèn)安裝的是 32 位版本,即使在 64 位系統(tǒng)上也是如此。您必須明確 選擇 Office 2010 64 位版本安裝選項(xiàng)。

在 VBA 7 中,必須更新現(xiàn)有 Windows 應(yīng)用程序編程接口 (API) 語(yǔ)句(Declare 語(yǔ)句)才能處理 64 位版本。另外,還必須更新這些語(yǔ)句使用的用戶定義類型中的地址指針和顯示窗口句柄。本文將詳細(xì)討論這一點(diǎn)以及 32 位和 64 位版本的 Office 2010 之間的兼容性問(wèn)題,并提供建議的解決方案。

使用 64 位版本的 Office 2010 構(gòu)建的應(yīng)用程序可以引用更大的地址空間,因此提供了使用比以往更多的物理內(nèi)存的機(jī)會(huì),從而有可能減少將數(shù)據(jù)移入和移出物理內(nèi)存所需的開(kāi)銷。

除了引用應(yīng)用程序用于存儲(chǔ)數(shù)據(jù)或存儲(chǔ)編程指令的物理內(nèi)存中的特定位置(又稱為指針)外,還可以使用地址來(lái)引用顯示窗口標(biāo)識(shí)符(稱為句柄)。根據(jù)您使用的是 32 位系統(tǒng)還是 64 位系統(tǒng),可確定指針或句柄的大?。ㄒ宰止?jié)為單位)。

在使用 64 位版本的 Office 2010 運(yùn)行現(xiàn)有解決方案時(shí)存在兩個(gè)基本問(wèn)題:

  • Office 2010 中的本機(jī) 64 位進(jìn)程無(wú)法加載 32 位二進(jìn)制文件。在使用現(xiàn)有 Microsoft ActiveX 控件和現(xiàn)有加載項(xiàng)時(shí),這被認(rèn)為是一個(gè)常見(jiàn)問(wèn)題,

  • VBA 以前不具有指針數(shù)據(jù)類型,因此,開(kāi)發(fā)人員使用 32 位變量來(lái)存儲(chǔ)指針和句柄。但現(xiàn)在在使用 Declare 語(yǔ)句時(shí),這些變量會(huì)截?cái)?API 調(diào)用返回的 64 位值。

VBA 7 是新的基本代碼,取代了早期版本的 VBA。32 位和 64 位版本的 Office 2010 中均包含 VBA 7。它提供了兩個(gè)條件編譯常量:VBA7Win64。通過(guò)測(cè)試您的應(yīng)用程序使用的是 VBA 7 還是以前版本的 VBA,VBA7 常量可幫助確保您的代碼的后向兼容性。Win64 常量用于測(cè)試代碼是以 32 位還是 64 位形式運(yùn)行的。下文將介紹這兩個(gè)編譯常量。

第三方及 Microsoft 提供的現(xiàn)有 32 位 ActiveX 控件與 64 位版本的 Office 2010 不兼容。對(duì)于 ActiveX 控件和 COM 對(duì)象,有三種可能的解決方案:

  • 如果您有源代碼,則可以自己生成 64 位版本,

  • 您可以與供應(yīng)商聯(lián)系以獲取更新版本,

  • 也可以搜索其他解決方案。

VBA 和類型庫(kù)的結(jié)合為您提供了許多用于創(chuàng)建 Microsoft Office 應(yīng)用程序的功能。不過(guò),有時(shí),您必須直接與計(jì)算機(jī)的操作系統(tǒng)及其他組件進(jìn)行通信,例如在您管理內(nèi)存或進(jìn)程時(shí),在使用用戶界面(例如窗口和控件)時(shí),或在修改 Windows 注冊(cè)表時(shí)。在這些情況下,最好選擇使用一個(gè)嵌入動(dòng)態(tài)鏈接庫(kù) (DLL) 文件中的外部函數(shù)。為此,可在 VBA 中使用 Declare 語(yǔ)句進(jìn)行 API 調(diào)用。

注釋

Microsoft 提供了一個(gè) Win32API.txt 文件,其中包含 1,500 個(gè) Declare 語(yǔ)句以及一個(gè)用于剪切所需 Declare 語(yǔ)句并將其粘貼到您的代碼中的工具。不過(guò),這些語(yǔ)句適用于 32 位系統(tǒng),必須使用下文討論的信息將其轉(zhuǎn)換為 64 位。您可以在 Excel MVP Jan Karel Pieterse 的網(wǎng)站 http://www.jkp-ads.com/articles/apideclarations.asp 上找到此類型的轉(zhuǎn)換示例。

Declare 語(yǔ)句類似于以下代碼之一,具體取決于您調(diào)用的是子例程(沒(méi)有返回值)還是函數(shù)(有返回值)。

Public/Private Declare Sub SubName Lib "LibName" Alias "AliasName" (argument list)Public/Private Declare Function FunctionName Lib "Libname" alias "aliasname" (argument list) As Type

SubName 函數(shù)或 FunctionName 函數(shù)會(huì)被替換為 DLL 文件中過(guò)程的實(shí)際名稱,表示在從 VBA 代碼調(diào)用過(guò)程時(shí)所使用的名稱。如果需要,您還可以為過(guò)程名稱指定 AliasName 參數(shù)。包含要調(diào)用的過(guò)程的 DLL 文件的名稱位于 Lib 關(guān)鍵字之后。最后,參數(shù)列表將包含必須傳遞給該過(guò)程的參數(shù)和數(shù)據(jù)類型。

下面的 Declare 語(yǔ)句將打開(kāi) Windows 注冊(cè)表中的一個(gè)子項(xiàng) 并替換其值。

Declare Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As Long, ByVal SubKey As String, NewKey As Long) As Long

RegOpenKeyA 函數(shù)的 Windows.h(窗口句柄)條目如下所示:

LONG RegOpenKeyA ( HKEY hKey, LPCSTR lpSubKey, HKEY *phkResult );

在 Microsoft Visual C 和 Microsoft Visual C++ 中,前面的示例對(duì) 32 位和 64 位都能夠正確編譯。這是因?yàn)?HKEY 定義為指針,其大小反映了在其中編譯代碼的平臺(tái)的內(nèi)存大小。

在以前版本的 VBA 中,沒(méi)有特定指針數(shù)據(jù)類型,因此使用了 Long 數(shù)據(jù)類型,而 Long 數(shù)據(jù)類型始終為 32 位,所以它在具有 64 位內(nèi)存的系統(tǒng)上使用時(shí)會(huì)發(fā)生中斷,因?yàn)榍?32 位可能被截?cái)嗷蚩赡芨采w其他內(nèi)存地址。以上任一情況都會(huì)導(dǎo)致不可預(yù)測(cè)的行為或系統(tǒng)崩潰。

為解決此問(wèn)題,VBA 現(xiàn)在包含真正的指針 數(shù)據(jù)類型 LongPtr。此新數(shù)據(jù)類型使您能夠正確編寫原始 Declare 語(yǔ)句,如下所示:

Declare PtrSafe Function RegOpenKeyA Lib "advapire32.dll" (ByVal hKey as LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long

此數(shù)據(jù)類型和新的 PtrSafe 屬性使您能夠在 32 位或 64 位系統(tǒng)上使用此 Declare 語(yǔ)句。PtrSafe 屬性向 VBA 編譯器指示 Declare 語(yǔ)句面向 64 位版本的 Office 2010。如果不使用此屬性,那么在 64 位系統(tǒng)中使用 Declare 語(yǔ)句會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤。請(qǐng)注意,PtrSafe 屬性在 32 位版本的 Office 2010 上是可選的。因此現(xiàn)有 Declare 語(yǔ)句始終能夠正常運(yùn)行。

下表提供了有關(guān)已討論過(guò)的新限定符和數(shù)據(jù)類型以及另一種數(shù)據(jù)類型、兩個(gè)轉(zhuǎn)換運(yùn)算符和三個(gè)函數(shù)的詳細(xì)信息。

類型

項(xiàng)

說(shuō)明

限定符

PtrSafe

指示 Declare 語(yǔ)句與 64 位兼容。此屬性在 64 位系統(tǒng)上是必需的。

數(shù)據(jù)類型

LongPtr

一種變量數(shù)據(jù)類型,在 32 位版本的 Office 2010 上是 4 字節(jié)數(shù)據(jù)類型,在 64 位版本上是 8 字節(jié)數(shù)據(jù)類型。這是為新代碼聲明指針或句柄的推薦方法,但如果它必須運(yùn)行在 64 位版本的 Office 2010 中,則也為舊代碼聲明指針或句柄。只有 32 位和 64 位上的 VBA 7 運(yùn)行時(shí)支持此數(shù)據(jù)類型。請(qǐng)注意,您可以為它賦予數(shù)值,但不能賦予數(shù)值類型。

數(shù)據(jù)類型

LongLong

這是只能在 64 位版本的 Office 2010 中使用的 8 字節(jié)數(shù)據(jù)類型。您可以賦予數(shù)值,但不能賦予數(shù)值類型(以避免截?cái)啵?/p>

轉(zhuǎn)換運(yùn)算符

CLngPtr

將簡(jiǎn)單表達(dá)式轉(zhuǎn)換為 LongPtr 數(shù)據(jù)類型。

轉(zhuǎn)換運(yùn)算符

CLngLng

將簡(jiǎn)單表達(dá)式轉(zhuǎn)換為 LongLong 數(shù)據(jù)類型。

函數(shù)

VarPtr

變量轉(zhuǎn)換器。在 64 位版本上返回 LongPtr,在 32 位版本上返回 Long(4 字節(jié))。

函數(shù)

ObjPtr

對(duì)象轉(zhuǎn)換器。在 64 位版本上返回 LongPtr,在 32 位版本上返回 Long(4 字節(jié))。

函數(shù)

StrPtr

字符串轉(zhuǎn)換器。在 64 位版本上返回 LongPtr,在 32 位版本上返回 Long(4 字節(jié))。

下面的示例演示如何在 Declare 語(yǔ)句中使用其中某些項(xiàng)。

Declare PtrSafe Function RegOpenKeyA Lib "advapi32.dll" (ByVal Key As LongPtr, ByVal SubKey As String, NewKey As LongPtr) As Long

請(qǐng)注意,沒(méi)有 PtrSafe 屬性的 Declare 語(yǔ)句被假定為與 64 位版本的 Office 2010 不兼容。

如前所述,有兩個(gè)新的條件編譯常量:VBA7Win64。為確保與以前版本的 Office 的向后兼容性,可使用 VBA7 常量(這是較典型的情況)來(lái)防止 64 位代碼在早期版本的 Office 中運(yùn)行。對(duì)于在 32 位版本和 64 位版本之間有所不同的代碼(例如調(diào)用數(shù)學(xué) API,它對(duì)其 64 位版本使用 LongLong,對(duì)其 32 位版本使用 Long),可使用 Win64 常量。下面的代碼演示如何使用這兩個(gè)常量。

#if Win64 then   Declare PtrSafe Function MyMathFunc Lib "User32" (ByVal N As LongLong) As LongLong#else   Declare Function MyMathFunc Lib "User32" (ByVal N As Long) As Long#end if#if VBA7 then   Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal N AS Long)#else   Declare Sub MessageBeep Lib "User32" (ByVal N AS Long)#end if

總而言之,如果您編寫 64 位代碼并打算在以前版本的 Microsoft Office 中使用它,則需要使用 VBA7 條件編譯常量。不過(guò),如果您在 Office 2010 中編寫 32 位代碼,則該代碼的工作方式與在以前版本的 Microsoft Office 中一樣,無(wú)需使用編譯常量。如果希望確保對(duì) 32 位版本使用 32 位語(yǔ)句,對(duì) 64 位版本使用 64 位語(yǔ)句,則最好選擇使用 Win64 條件編譯常量。

下面的代碼是需要更新的舊 VBA 代碼的示例。請(qǐng)注意舊代碼中更新為使用 LongPtr 的數(shù)據(jù)類型,因?yàn)樗鼈円镁浔蛑羔?/p>

舊 VBA 代碼

Declare Function SHBrowseForFolder Lib "shell32.dll" _  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As Long  Public Type BROWSEINFO  hOwner As Long  pidlRoot As Long  pszDisplayName As String  lpszTitle As String  ulFlags As Long  lpfn As Long  lParam As Long  iImage As LongEnd Type

新 VBA 代碼

#if VBA7 then    ' VBA7 Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As LongPublic Type BROWSEINFO  hOwner As LongPtr  pidlRoot As Long  pszDisplayName As String  lpszTitle As String  ulFlags As Long  lpfn As LongPtr  lParam As LongPtr  iImage As LongEnd Type #else    ' Downlevel when using previous version of VBA7Declare Function SHBrowseForFolder Lib "shell32.dll" _  Alias "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As LongPublic Type BROWSEINFO  hOwner As Long  pidlRoot As Long  pszDisplayName As String  lpszTitle As String  ulFlags As Long  lpfn As Long  lParam As Long  iImage As LongEnd Type #end ifSub TestSHBrowseForFolder ()    Dim bInfo As BROWSEINFO    Dim pidList As Long    bInfo.pidlRoot = 0&    bInfo.ulFlags = &H1    pidList = SHBrowseForFolder(bInfo)End Sub

增加了 64 位版本的 Office 2010 后,您可以移動(dòng)更多數(shù)據(jù)來(lái)增強(qiáng)功能。編寫 32 位代碼時(shí),可以使用 64 位版本的 Microsoft Office 而無(wú)需進(jìn)行任何更改。不過(guò),在編寫 64 位代碼時(shí),應(yīng)確保您的代碼包含特定關(guān)鍵字和條件編譯常量,以確保代碼與早期版本的 Microsoft Office 向后兼容,并確保在混合 32 位和 64 位代碼時(shí)執(zhí)行了正確的代碼。

有關(guān) Declare 語(yǔ)句的詳細(xì)信息,請(qǐng)參閱以下資源:

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
VBA 向64位轉(zhuǎn)換需要注意的事項(xiàng)
VBA在32位下沒(méi)問(wèn)題,到64位異常報(bào)錯(cuò)
Excel黑科技 vba中用Inputbox對(duì)話框接受輸入密碼時(shí)顯示為*
使用 Declare 語(yǔ)句
Excel VBA(6) – 聲明變量那些事
bat命令打開(kāi)excel并調(diào)用VBA程序
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服