Office中國(guó)論壇/Access中國(guó)論壇

 找回密碼
 注冊(cè)

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3436|回復(fù): 3
打印 上一主題 下一主題

[模塊/函數(shù)] 【原創(chuàng)】Office32位和Office64位 編程注意事項(xiàng)

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-6-25 17:01:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本帖最后由 盜夢(mèng) 于 2015-6-25 17:21 編輯

Office32位和Office64位表面上沒(méi)有什么區(qū)別。
實(shí)際上,在vba方面要注意的是API和個(gè)別函數(shù)的使用。(該vba包括 Access vba,Excel vba,Word vba,PPT vba等)

以下是我最近寫代碼發(fā)現(xiàn)并總結(jié)出來(lái)的。

首先,說(shuō)說(shuō)API。
例如,在Office32位中API是這樣聲明的:
  1. Private Declare Function GetModuleHandleA Lib "kernel32"  _
  2.                                (ByVal lpModuleName As String) As Long
復(fù)制代碼
而在Office64位需要在 Function 或者 Sub 前面加一個(gè)關(guān)鍵字,PtrSafe :
  1. Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32"  _
  2.                                (ByVal lpModuleName As String) As Long
復(fù)制代碼

PtrSafe 是 “指針安全” 的意思,到了64位,受影響最大的就是指針。
你可能會(huì)跳出了說(shuō)vba沒(méi)有指針。
實(shí)際上很多API函數(shù)是由C/C++編寫的,內(nèi)部實(shí)現(xiàn)機(jī)制有些會(huì)用到指針。

當(dāng)然,同樣的代碼,你不想寫兩個(gè)文件,可以這么做:
  1. #If  vba7  Then
  2.        '64位的代碼
  3.        Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32"  _
  4.                                (ByVal lpModuleName As String) As Long
  5. #Else
  6.        '32位的代碼
  7.        Private Declare Function GetModuleHandleA Lib "kernel32"  _
  8.                                (ByVal lpModuleName As String) As Long
  9. #End If
復(fù)制代碼

這個(gè)披上 # 號(hào)的 條件結(jié)構(gòu) 叫作 “條件編譯”,也就是系統(tǒng)在編譯的時(shí)候就去判斷里面的條件,選擇性編譯。
這樣處理就可以實(shí)現(xiàn)32位Office和64位Office 代碼兼容問(wèn)題。

除此之外,還有3點(diǎn)要注意:
1、 AddressOf 函數(shù)
      在32位Office中,AddressOf 函數(shù)返回的類型是 Long;
      而在64位Office中,將返回 LongPtr 類型。這個(gè)類型也是一種指針類型。
      所以,調(diào)試編輯的時(shí)候,提示AddressOf 類型不符合的時(shí)候,就是返回的類型和你API函數(shù)的參數(shù)類型不一致。這是只需要把API函數(shù)對(duì)應(yīng)的變量類型改為 LongPtr 即可。

2、VarPtr函數(shù),ObjPtr函數(shù),StrPtr函數(shù)
     這三個(gè)函數(shù)也是同樣的道理,在64位將返回 LongPtr類型。

3、部分屬性也要注意
      像 Application.Hinstance ,在64位Office要用 Application.HinstancePtr 才不會(huì)出錯(cuò)。
      這種在64位vba寫代碼時(shí)候,代碼提示發(fā)現(xiàn)有一個(gè)一樣的屬性名,但這個(gè)屬性名后面跟著 Ptr 后綴,不用看了,用它就沒(méi)錯(cuò)了。




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2015-6-25 17:09:59 | 只看該作者
之前試過(guò),復(fù)制32位的api聲明到64位的文件里(例如將),系統(tǒng)會(huì)報(bào)錯(cuò),要求加上關(guān)鍵字。

點(diǎn)擊這里給我發(fā)消息

3#
 樓主| 發(fā)表于 2015-6-25 17:11:08 | 只看該作者
roych 發(fā)表于 2015-6-25 17:09
之前試過(guò),復(fù)制32位的api聲明到64位的文件里(例如將),系統(tǒng)會(huì)報(bào)錯(cuò),要求加上關(guān)鍵字。

現(xiàn)在有些人用上了 64位 Office了,而且將會(huì)越來(lái)越多,所以兼容性問(wèn)題不得不考慮
4#
發(fā)表于 2015-6-26 14:25:43 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-17 05:19 , Processed in 0.120047 second(s), 27 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表