• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

        Office 95 API 的企業(yè)開(kāi)發(fā)者向?qū)? /></div>
<div   id=

        Office 95 API 的企業(yè)開(kāi)發(fā)者向?qū)?/h1>
        更新時(shí)間:2019-06-29 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

        摘要

        這篇技術(shù)文章探討如何編寫(xiě)Microsoft Office解決方案代碼,以便使用16位和32位版本的Office產(chǎn)品順利進(jìn)行應(yīng)用編程接口(API)調(diào)用。特別是,本文適用于Microsoft Access 、Visual Basic 、Microsoft Word 、Microsoft Excel 和Microsoft Project 。實(shí)現(xiàn)這種API調(diào)用的方法有三類(lèi):使用REGISTER、使用Declare語(yǔ)句和使用一個(gè)類(lèi)型庫(kù)。本文分別對(duì)這三種API調(diào)用方法進(jìn)行了探討和舉例。在本文中,假設(shè)讀者已對(duì)我先前的一篇技術(shù)文章“將你基于16位Office的解決方案移植到32位Office ”較為熟悉,并且假設(shè)讀者是一位經(jīng)驗(yàn)豐富的Office 開(kāi)發(fā)者,他需要移植或編寫(xiě)解決方案,以滿(mǎn)足16位到32位互操作性的新要求。

        引言

        對(duì)于編寫(xiě)一個(gè)面向多個(gè)平臺(tái)多個(gè)版本Microsoft Office 產(chǎn)品的解決方案問(wèn)題,它是大多數(shù)編譯語(yǔ)言開(kāi)發(fā)者所不熟悉的。編譯語(yǔ)言應(yīng)用程序開(kāi)發(fā)者喜歡在編輯程序開(kāi)發(fā)中選擇一個(gè)時(shí)間段,將解決方案加到一個(gè)執(zhí)行文件中,而很少需要解決由產(chǎn)品開(kāi)發(fā)引起的問(wèn)題。一個(gè)Office 解決方案應(yīng)具有一個(gè)可在所有Office 產(chǎn)品和所有操作系統(tǒng)中正確執(zhí)行的解決方案文件(一個(gè).XLS、.MDB、.MPP或.DOT文件)。Office 開(kāi)發(fā)者必須編寫(xiě)具有對(duì)前五年內(nèi)發(fā)布的版本的向后兼容性和對(duì)將發(fā)布的下一版本的向前兼容性。例如,一個(gè)在Microsoft Excel 4.0和Microsoft Excel 5.0上運(yùn)行的費(fèi)用報(bào)告應(yīng)能在Microsoft Excel NT、Microsoft Excel 95和Microsoft Excel 2001(假定存在)上運(yùn)行。

        Office 95將32位Office 產(chǎn)品引入到主流企業(yè)環(huán)境中,它們將與16位Office 產(chǎn)品共存許多年。在我以前的一篇技術(shù)文章“將你基于16位Office的解決方案移植到32位Office ”中,對(duì)不能從一個(gè)32位應(yīng)用程序調(diào)用16位API的問(wèn)題以及不能從一個(gè)16位應(yīng)用程序調(diào)用32位API的問(wèn)題進(jìn)行了闡述,在那篇文章中列出的16位/32位互操作性解決方案將在本文中作進(jìn)一步的探討。

        注:根據(jù)經(jīng)驗(yàn),我把Windows 3.1中的API調(diào)用轉(zhuǎn)換為Win32 應(yīng)用編程接口(API)調(diào)用稱(chēng)之為32A規(guī)則,即:“如果在任何調(diào)用參數(shù)中使用了名稱(chēng)字符串,給DLL名添加一個(gè)32,給函數(shù)名添加一個(gè)A(對(duì)于A(yíng)NSI)”。這個(gè)經(jīng)驗(yàn)對(duì)于絕大多數(shù)API調(diào)用是可行的,但對(duì)于某些函數(shù),這個(gè)經(jīng)驗(yàn)可能行不通,因此它并不是絕對(duì)正確的解決方案。

        16位/32位互操作性解決方案比16位API調(diào)用移植到相當(dāng)?shù)?2位API調(diào)用(換句話(huà)說(shuō),使用32A規(guī)則)的要求更多;它需要解決方案在16位或32位Office 產(chǎn)品中執(zhí)行時(shí)能選擇適當(dāng)?shù)腁PI。

        術(shù)語(yǔ)

        為了避免用語(yǔ)使用的混淆,下列表中定義了在本技術(shù)文章中使用的術(shù)語(yǔ):

        術(shù)語(yǔ) 定義
        Office 產(chǎn)品 不將代碼編譯為一個(gè)可執(zhí)行程序的產(chǎn)品。下列產(chǎn)品之一:Microsoft Project 、Microsoft Access、Word 和Microsoft Excel 。
        編譯語(yǔ)言 將代碼編譯為一個(gè)可執(zhí)行程序的產(chǎn)品,例如Visual Basic 、FORTRAN、PowerStation 、Visual FoxPro 和Visual C++。
        解決方案 由第三方或開(kāi)發(fā)者使用某個(gè)Office 產(chǎn)品及其格式(如Microsoft Excel (.XLS)、Word (.DOT)、Microsoft Project (.MPP)或者M(jìn)icrosoft Access(.MDB))開(kāi)發(fā)的應(yīng)用程序。
        解決方案代碼 編寫(xiě)有解決方案的代碼(XLM或Basic或者結(jié)合使用)
        平臺(tái) Microsoft Windows和Apple Macintosh 操作系統(tǒng)。一些Office 產(chǎn)品適用于所有Windows和Macintosh操作系統(tǒng)。通過(guò)將解決方案從一個(gè)操作系統(tǒng)復(fù)制到另一操作系統(tǒng), Microsoft Excel 可在Macintosh和Windows PC中執(zhí)行同一應(yīng)用程序(在一定的限制條件下)。

         

        API調(diào)用方法

        解決方案代碼可采用下列三種方法之一進(jìn)行編寫(xiě)--使用Microsoft Excel 宏(XLM)、Basic(Access Basic、Visual Basic 、VBA和WordBasic)或者混合使用XLM和Basic。XLM使用REGISTER和CALL命令來(lái)進(jìn)行API調(diào)用,Basic使用Declare語(yǔ)句、類(lèi)型庫(kù)或者這兩者的結(jié)合使用來(lái)進(jìn)行API調(diào)用。經(jīng)一個(gè)開(kāi)發(fā)者傳給另一開(kāi)發(fā)者的Microsoft Excel 解決方案可以使用所有這些方法進(jìn)行API調(diào)用。這三種方法對(duì)于最新版本的Microsoft Excel 都適用。

        表1 API調(diào)用方法描述

        方法 語(yǔ)言 進(jìn)行API調(diào)用的方法
        REGISTER XLM宏 從宏中使用REGISTER和CALL函數(shù)
        Declare Access Basic、
        Visual Basic 、

        VBA、WordBasic
        使用Declare語(yǔ)句
        類(lèi)型庫(kù) 僅VBA 從對(duì)象瀏覽器上選擇類(lèi)型庫(kù)方法

        這些方法不會(huì)產(chǎn)生某個(gè)特定版本的解決方案,它取決于開(kāi)發(fā)者編寫(xiě)代碼的引用或解決方案所必須運(yùn)行的產(chǎn)品范圍。例如,為了使解決方案在Microsoft Excel 4.0中也有效,開(kāi)發(fā)者可以在Microsoft Excel 95的XLM中編寫(xiě)一個(gè)解決方案。表2中列出了各種API調(diào)用可在哪些Microsoft 產(chǎn)品中使用。

        表2 Microsoft 產(chǎn)品的API調(diào)用方法

        產(chǎn)品版本 REGISTER方法 Declare方法 類(lèi)型庫(kù)方法
        Microsoft Excel 3.0,4.0 X    
        Microsoft Excel 5.0,5.0NT,95 X X X
        Word 2.0,6.0,95   X  
        Visual Basic 1.0,2.0,3.0   X  
        Visual Basic 4.0   X X
        Project 4.0,95   X  
        Microsoft Access1.0,1.1,2.0   X  
        Microsoft Access95   X X
        FoxPro 2.5   X  
        FoxPro 3.0   X X

        我們?cè)谟懻?6位和32位API調(diào)用時(shí),都將使用同一個(gè)簡(jiǎn)單的API調(diào)用示例--GetTickCount來(lái)進(jìn)行論述。

        REGISTER方法

        對(duì)于在編寫(xiě)Office 解決方案前先在Visual Basic 中編寫(xiě)過(guò)代碼的開(kāi)發(fā)者,他們并不熟悉使用REGISTER方法的API調(diào)用。舊版本Microsoft Excel 的開(kāi)發(fā)者從XLM中進(jìn)行API調(diào)用,并避免使用VBA。我們不能把XLM看作是過(guò)時(shí)的技術(shù)--雖然從Microsoft Excel 4.0開(kāi)始未對(duì)其更改。如果性能問(wèn)題變得很重要時(shí),XLM仍是最好的選擇。Microsoft Excel 5.0開(kāi)發(fā)者工具包中陳述了直接從XLM中進(jìn)行API調(diào)用的優(yōu)點(diǎn)。

        由于C API最易于在Microsoft Excel 宏和工作表上使用,因此對(duì)于Visual Basic 所用的外部函數(shù)的編寫(xiě),它并不是非常好(雖然VB 和C API可被融入混合解決方案中)。

        為了從XLM進(jìn)行API調(diào)用,要求使用REGISTER函數(shù)來(lái)引用動(dòng)態(tài)連接庫(kù)(DLL)以及使用CALL函數(shù)來(lái)執(zhí)行它。REGISTER函數(shù)與VBA中的Declare語(yǔ)句的作用是一樣的。推薦的REGISTER句法如下:

        REGISTER(module_text,procedure,type_text,function_text,argument_text,macro_type,category,shortcut_text)

        要返回到所給出的API調(diào)用示例,我們可以在XLM的一些代碼行中采用GetTickCount。

        這個(gè)代碼在16位Microsoft Excel 中產(chǎn)生下列輸出:

        如果我們?cè)?2位的Microsoft Excel 中運(yùn)行這個(gè)代碼,結(jié)果是失敗的。API調(diào)用返回#VALUE!,表明傳遞給DLL或從DLL中傳遞變量是失敗的:

        我們必須將這個(gè)代碼轉(zhuǎn)換為一個(gè)32位的API調(diào)用,因此,我們使用32A規(guī)則,在DLL名上添加一個(gè)32,如果是字符串,在其上添加一個(gè)A。采用32A規(guī)則的代碼如下所示。

        在調(diào)用TestGetTickCount32A時(shí),我們會(huì)遇到另一種錯(cuò)誤。返回#NAME?變量,這意味著在DLL中不存在這個(gè)函數(shù)。它可能是錯(cuò)誤的DLL或錯(cuò)誤的函數(shù)名(記住,函數(shù)名是區(qū)分大小寫(xiě)的)。這必定是32A規(guī)則的一個(gè)例外(我承認(rèn),我是有意選用這個(gè)函數(shù)的)。

        在MSDN庫(kù)中,使用關(guān)鍵字索引在PlatformSDK(平臺(tái)軟件開(kāi)發(fā)包)中查找GetTickCount。在主題的頂端彈出的快速信息(Quick Info)會(huì)告訴你該函數(shù)在KERNEL32庫(kù)中(在Window 3.x中,該函數(shù)在USER庫(kù)中)。下列代碼列出修改后的32位Microsoft Excel 宏。

        在32位Microsoft Excel 中運(yùn)行此代碼,我們得到正確的結(jié)果:

        為說(shuō)明在16位和32位Microsoft Excel 中的API調(diào)用方式,參閱表3,表中顯示了這些宏的結(jié)果。使用32A規(guī)則的宏(“32A位”)在16位和32位解決方案中產(chǎn)生的結(jié)果相同。它說(shuō)明了REGISTER函數(shù)從16位或者32位解決方案中定位(或定位失敗)16位和32位DLL中的函數(shù)名的能力。返回#VALUE!表明在傳遞或接收參數(shù)中出現(xiàn)了問(wèn)題。

        表3:從16位和32位Microsoft Excel 進(jìn)行調(diào)用的結(jié)果

        Microsoft Excel 4.0(16位版) Microsoft Excel 95(32位版)

        我們能夠編寫(xiě)宏以進(jìn)行16位API調(diào)用或32位API調(diào)用,但是,我們必須編寫(xiě)可進(jìn)行16位API調(diào)用和32位API調(diào)用的宏,這取決于Office 產(chǎn)品的版本。解決方案代碼必須在16位Microsoft Excel 和32位Microsoft Excel 上均能運(yùn)行。在我以前的文章(“將你基于16位Office的解決方案移植到32位Office ”)中描述的VBA函數(shù)Engine32不能在Microsoft Excel 4.0(Microsoft Excel 4.0不包含VBA)中正常工作。Engine32可在Microsoft Excel 5.0及更高版本上正常工作。一個(gè)與Microsoft Excel 4.0兼容的Engine32函數(shù)必須使用宏代碼。

        XLM的Engine32函數(shù)

        對(duì)于XLM,解決方案與VBA解決方案類(lèi)似。如果Microsoft Excel 是一個(gè)32位版,函數(shù)信息(“osversion(操作系統(tǒng)版本)”)將包含32。如果Microsoft Excel 是一個(gè)32位版,下列所示的Engine32宏返回TRUE;如果Microsoft Excel 是16位版,該宏返回FALSE。

        REGISTER方法解決方案的示例

        由于Enging32已定義,GetTickCount的宏代碼很簡(jiǎn)單:

        Engine32將在所有版本的Microsoft Excel 中運(yùn)行正常。GetTickCount函數(shù)與在Windows3.1中的API調(diào)用是一樣的。

        注:如果對(duì)性能關(guān)心,你應(yīng)在裝載這個(gè)解決方案時(shí)注冊(cè)所有API調(diào)用。

        REGISTER方法解決方案的步驟

        如果你正將Microsoft Excel 解決方案轉(zhuǎn)換為能在16位和32位產(chǎn)品上運(yùn)行的解決方案,我建議你采用下列步驟:

        創(chuàng)建一個(gè)名為APICALLS的新宏;

        在A(yíng)PICALLS宏中創(chuàng)建Engine32函數(shù);

        定位解決方案中的所有REGISTER函數(shù),并將它們移到APICALLS中,一個(gè)一欄;

        使用上面的REGISTER解決方案示例中的宏代碼作為一個(gè)模板,在你的宏表中為每個(gè)API創(chuàng)建函數(shù);

        添加所需的ARGUMENT行;

        添加所需的RESULT行;

        添加16位API REGISTER行,在函數(shù)名后加上16;

        添加32位API REGISTER行,在函數(shù)名后加上32;

        進(jìn)行任何數(shù)據(jù)處理以進(jìn)行API調(diào)用;

        添加一個(gè)IF行以調(diào)用相應(yīng)的API;

        RETURE返回變量(如果有);

        測(cè)試函數(shù);

        為Microsoft Excel 定義函數(shù)。

        這個(gè)過(guò)程可使宏表中現(xiàn)有的API調(diào)用保持原樣。一旦你創(chuàng)建了宏表APICALLS(并進(jìn)行了測(cè)試),你可以把它加到其他解決方案中,重復(fù)使用這個(gè)宏,這樣可節(jié)省轉(zhuǎn)換時(shí)間。該宏表的內(nèi)容獨(dú)立于解決方案(它僅包含Windows API調(diào)用)并可在其他解決方案中重復(fù)使用。這個(gè)宏表APICALLS成為將來(lái)開(kāi)發(fā)16位/32位解決方案的羅塞達(dá)石碑。

        Declare方法

        VBA的引入給Microsoft Excel 開(kāi)發(fā)者提供了XLM的替代方法。Visual Basic 、WordBasic和Microsoft Access開(kāi)發(fā)者也能毫無(wú)困難地編寫(xiě)Microsoft Excel 和Microsoft Project解決方案。Basic代碼可在廣泛的產(chǎn)品中進(jìn)行交換。年輕一代的Office 開(kāi)發(fā)者將在VBA中編寫(xiě)代碼,而很少使用XLM。

        從VBA中調(diào)用API需要使用API Declare語(yǔ)句。一個(gè)經(jīng)聲明的API可在Basic代碼(或在一個(gè)宏中)的任何地方被調(diào)用。編寫(xiě)Declare語(yǔ)句有兩種方法,如下所示:

        Word Declare語(yǔ)句

        注釋?zhuān)篧ord是首選的編寫(xiě)Declare 語(yǔ)句的方法

        注釋?zhuān)核母袷绞枪潭ǖ模哂邢蚝蠹嫒菪浴?

        Declare Sub SubName Lib LibName$ [(ArgumentList)] [ Alias Routine$]

        Declare Function FunctionName[$] Lib LibName$ [( ArgumentList)] [Alias Routine$] As Type

        VBA、Basic和Microsoft Access Declare語(yǔ)句

        Declare Sub globalname Lib "libname" [Alias "aliasname" ][([ argumentlist])]

        Declare Function globalname Lib libname [Alias aliasname ] [([ argumentlist])] [As type]

        因?yàn)槲乙言凇皩⒛慊?6位Office的解決方案移植到32位Office ”中進(jìn)行了這方面的一些討論,并得出了上面的分類(lèi),我將簡(jiǎn)要地利用一個(gè)函數(shù)示例來(lái)說(shuō)明Declare解決方案。

        Basic Engine32函數(shù)

        如果32位API調(diào)用是正常的(16位API調(diào)用失敗),Engine32函數(shù)返回True;如果16位API調(diào)用是正常的(32位API調(diào)用失敗),該函數(shù)返回False。在“將你基于16位Office的解決方案移植到32位Office ”一文中給出的Engine32函數(shù)被設(shè)計(jì)成可說(shuō)明它們?cè)诿總(gè)Office 產(chǎn)品中的差異的示例。下面給出的是經(jīng)修改后的函數(shù),它具有更好的性能并能在更多的版本上運(yùn)行。

        利用在第一個(gè)函數(shù)中初始化靜態(tài)變量可改善性能。隨后的所有調(diào)用使用這些靜態(tài)變量,而不是重復(fù)進(jìn)行額外的函數(shù)調(diào)用。改善性能的另一方法是初始化一個(gè)全局或公有變量;然而,它存在一個(gè)缺陷,在一些產(chǎn)品中發(fā)生Reset(重置)時(shí),在全局變量得到重新初始化前,隨后的所有API調(diào)用可能失敗。

        Microsoft Excel 5或更高版本和Project 4或更高版本

        如果Microsoft Excel 和Microsoft Project 是32位的產(chǎn)品,它們中的Application.OperatingSystem屬性通常包含32。由于Microsoft Excel 5.0既有16位產(chǎn)品又有32位產(chǎn)品,因此產(chǎn)品版本號(hào)是不充分的。

        Function Engine32%()

        Static sEngine32%,SEval% 注釋?zhuān)篠tatics用于性能的改善。

        If SEval% Then Engine32%=sEngine32%: Exit Function

        If instr(Application.OperatingSystem,"32") then sEngine32%=True

        Seval%=True

        Engine32%=sEngine32%

        End Function

        Microsoft Access 1.1或更高版

        Microsoft Access不具有既有16位又有32位產(chǎn)品的版本。通過(guò)調(diào)用SysCmd檢查版本號(hào),確定正在使用的Microsoft Access的版本。Microsoft Access 1.1在構(gòu)造時(shí)沒(méi)有加入一個(gè)版本號(hào)常量,因此,我們通常使用7,以確保代碼可在Microsoft Access中正常工作。這種方法可用來(lái)查看你的解決方案代碼進(jìn)行的是一個(gè)16位還是一個(gè)32位API調(diào)用。

        Function Engine32% ()

        Static sEngine32%,SEval%

        If SEval% Then Engine32%=sEngine32%: Exit Function

        If SysCmd(7) > 2 Then sEngine32% = True

        Seval%=True

        End Function

        Word for Wndows 2.0或更高版

        由于Word不支持靜態(tài)變量,Word 必須每次對(duì)Engine32函數(shù)賦值。首先,我們檢查產(chǎn)品版本號(hào)是否表明其是一個(gè)32位版本,然后我們檢查操作系統(tǒng)的版本,查看它是否是一個(gè)32位的操作系統(tǒng)。這兩個(gè)步驟是需要的,因?yàn)閃ord 6.0以前的版本不能使用GetSystemInfo,并且Word 6.0既具有16位版又具有32位版。

        Function Engine32

        Engine32 = 0

        If Val(AppInfo$(2)) > 5 Then

        OS$ = GetSystemInfo$(23)

        If Val(OS$) > 6.3 Or Len(OS$) = 0 Then Engine32 = - 1

        End If

        End Function

        Visual Basic

        雖然Visual Basic 不使用解決方案代碼,但Basic代碼通常要與包含上述的產(chǎn)品之間進(jìn)行交換。Visual Basic 4.0沒(méi)有 Application.OperatingSystem 屬性(它不是VBA所專(zhuān)有的一部分),而是使用條件編譯#IF和 #ELSE。如果你打算將你的代碼與其他Microsoft 產(chǎn)品共享,你應(yīng)創(chuàng)建下列函數(shù)(不要在別處使用條件編譯):

        Function Engine32%()

        注釋?zhuān)哼@僅針對(duì) VB4。

        #IF WIN16

        Engine32% = False

        #ELSE

        Engine32% = True

        #ENDIF

        End Function

        對(duì)于更早版本的Visual Basic ,使用下列函數(shù):

        Function Engine32%()

        注釋?zhuān)哼@是用于 VB1 - VB3的; 不支持#IF。

        Engine32% = False

        End Function

        Declare方法解決方案的示例

        下列代碼演示了Declare方法解決方案(不包括Word ):

        Declare Function GetTickCount32 Lib "Kernel32" Alias "GetTickCount" () As Long

        Declare Function GetTickCount16 Lib "USER" Alias "GetTickCount" () As Long

        Function GetTickCount() As Long

        If Engine32() Then

        GetTickCount = GetTickCount32()

        Else

        GetTickCount = GetTickCount16()

        End If

        End Function

        Engine32函數(shù)可用來(lái)確定進(jìn)行的API調(diào)用。Declare語(yǔ)句指示實(shí)際的API函數(shù)名的Alias(別名),以避免偶爾的大小寫(xiě)變化(32位API調(diào)用是區(qū)分大小寫(xiě)的),然后在函數(shù)后添加16或32以表明API函數(shù)的位數(shù)(是16位還是32位)。

        這個(gè)代碼可在除Word 外的所有Office 產(chǎn)品中復(fù)制和粘貼。WordBasic在其他Office 產(chǎn)品使用Basic之前已經(jīng)存在,并與之不同。我們將在后面探討Word 解決方案。

        Declare方法解決方案的步驟

        如果你正將解決方案轉(zhuǎn)換為能在16位和32位產(chǎn)品上運(yùn)行的解決方案,我建議你采用下列步驟:

        創(chuàng)建一個(gè)名為APICalls的新模塊;

        在A(yíng)PICalls宏中創(chuàng)建Engine32函數(shù);

        定位解決方案中的所有Declare函數(shù),并將它們移到APICalls中;

        使用“Declare方法解決方案的示例”中的宏代碼作為一個(gè)模板,為每個(gè)API創(chuàng)建函數(shù);

        自變量應(yīng)與Windows 3.1 版API調(diào)用匹配;

        結(jié)果應(yīng)是Win32 API調(diào)用的結(jié)果(若需要,Visual Basic 將自動(dòng)轉(zhuǎn)換為Windows 3.1版);

        添加16位API Declare行,在函數(shù)名后加上16;

        添加32位API Declare行,在函數(shù)名后加上32;

        進(jìn)行任何數(shù)據(jù)處理;

        添加一個(gè)IF行以調(diào)用相應(yīng)的API;

        RETURE返回變量(如果有);

        測(cè)試函數(shù)。

        這個(gè)過(guò)程使得在其他模塊中現(xiàn)有的調(diào)用保持原樣。一旦開(kāi)發(fā)者定義并測(cè)試了APICalls模塊,她或他可以將這個(gè)模塊加入到其他解決方案中并可重復(fù)使用,這樣可節(jié)省開(kāi)發(fā)時(shí)間。這個(gè)模塊的內(nèi)容獨(dú)立于解決方案,并且開(kāi)發(fā)者可以重復(fù)使用這個(gè)模塊。模塊APICalls成為將來(lái)開(kāi)發(fā)VBA中16位/32位解決方案的一個(gè)組成部分。

        API包裝的替代解決方案

        我通常在A(yíng)PI調(diào)用上加一層包裝,而不是將API調(diào)用暴露在代碼中。例如,我會(huì)將代碼包裝在GetProfileString上,以創(chuàng)建一個(gè)名為vbGetWinIni的函數(shù),該函數(shù)采用相同的自變量,但返回的是字符串。我在“創(chuàng)建有用的內(nèi)在Visual Basic和Microsoft Access函數(shù)”一文中論述了公用API包裝到DLL的轉(zhuǎn)換問(wèn)題。

        如果你以這種方式編寫(xiě)代碼,你可能想要修改API包裝函數(shù)以調(diào)用相應(yīng)的API,而不是額外創(chuàng)建函數(shù)。

        Word Declare方法解決方案示例

        Word具有不同的Declare格式和句法。Word解決方案比較復(fù)雜,這是因?yàn)槟悴荒軐?6位和32位Declare語(yǔ)句都放在相同的宏中。

        解決方案將創(chuàng)建三個(gè)宏庫(kù):APICALL16、APICALL32(它們包含針對(duì)每個(gè)操作環(huán)境的Declare語(yǔ)句)以及一個(gè)具有16位/32位互操作性的宏APICALLS。這可能聽(tīng)起來(lái)很混亂,那么讓我們一步一步討論。

        首先,我們創(chuàng)建一個(gè)名為APICALL16的宏庫(kù)。這個(gè)宏包含所有16位API Decalre語(yǔ)句。

        注釋?zhuān)哼@是APICALL16 -- 所有16位Declare語(yǔ)句都包含在此處。

        Declare Function GetTickCount16 Lib "USER" Alias "GetTickCount"() As Long

        Function GetTickCount

        GetTickCount = GetTickCount16

        End Function

        其次,我們創(chuàng)建一個(gè)名為APICALL32的宏庫(kù)。這個(gè)宏包含所有32位API Declare語(yǔ)句。

        注釋?zhuān)哼@是 APICALL32 -- 所有32位 Declare 語(yǔ)句都包含在此處。

        Declare Function GetTickCount32 Lib "KERNEL32"() Alias "GetTickCount" As Long

        Function GetTickCount

        GetTickCount = GetTickCount32

        End Function

        第三步,我們創(chuàng)建一個(gè)名為APICALLS的宏庫(kù)。這個(gè)宏包含Engine32和你的解決方案代碼所要調(diào)用的過(guò)程。

        注釋?zhuān)哼@是APICALLS -- 這個(gè)宏中不包含任何Declare語(yǔ)句。

        Function Engine32

        Engine32 = 0

        If Val(AppInfo$(2)) > 5 Then

        OS$ = GetSystemInfo$(23)

        If Val(OS$) > 6.3 Or Len(OS$) = 0 Then Engine32 = - 1

        End If

        End Function

        Function GetTickCount

        If Engine32 Then

        GetTickCount = APICall32.GetTickCount

        Else

        GetTickCount = APICall16.GetTickCount

        End If

        End Function

        注釋?zhuān)浩渌鸄PI函數(shù)調(diào)用包含在此處。

        你現(xiàn)在可以從你的解決方案代碼中調(diào)用這個(gè)函數(shù)。你必須以APICALLS開(kāi)始你的調(diào)用,例如:

        Sub MAIN

        MsgBox Str$(APICalls.GetTickCount)

        End Sub

        Word Declare方法解決方案的步驟

        如果你正將Word解決方案轉(zhuǎn)換為能在16位和32位產(chǎn)品上運(yùn)行的解決方案,我建議你采用下列步驟:

        創(chuàng)建一個(gè)名為APICALLS的新模塊;

        在A(yíng)PICALLS中創(chuàng)建Engine32函數(shù);

        創(chuàng)建一個(gè)名為APICALL16的模塊;

        定位解決方案中的所有16位Declare語(yǔ)句,并將它們移到APICALL16中;

        創(chuàng)建一個(gè)名為APICALL32的新模塊;

        創(chuàng)建相當(dāng)?shù)?2位Declare語(yǔ)句,并將它們置于A(yíng)PICALL32中。

        使用上述模板,為三個(gè)宏庫(kù)中的每個(gè)API創(chuàng)建函數(shù);

        在調(diào)用所有API前,在你的解決方案代碼中添加APICALLS;

        測(cè)試每個(gè)函數(shù)。

        這個(gè)過(guò)程使得在其他模塊中現(xiàn)有的調(diào)用保持原樣。一旦開(kāi)發(fā)者定義和測(cè)試了這些宏,她或他可將這些宏添加到NORMAL.DOTMO模板中,并可在其他解決方案中重復(fù)使用這些宏,以節(jié)省時(shí)間。

        類(lèi)型庫(kù)方法

        進(jìn)行API調(diào)用的類(lèi)型庫(kù)方法對(duì)于大多數(shù)開(kāi)發(fā)者來(lái)說(shuō)都是較新的內(nèi)容。在Bruce McKinney的一本將由Microsoft出版的書(shū)《Visual Basic核心》中,包含了16位API調(diào)用(WIN16.TLB)的Windows API Functions函數(shù)類(lèi)型庫(kù)以及一個(gè)與32位API調(diào)用(WIN32.TLB)匹配的類(lèi)型庫(kù)。一旦這些類(lèi)型庫(kù)被注冊(cè),對(duì)于16位或32位版本的Office產(chǎn)品,相應(yīng)的類(lèi)型庫(kù)將被裝載。

        一個(gè)類(lèi)型庫(kù)可提供Microsoft Excel 5.0或更高版、Microsoft Project 4.0或更高版、Visual Basic 4.0或更高版以及Microsoft Access 95或更高版產(chǎn)品的API調(diào)用的簡(jiǎn)易途徑。所有這些Windows API調(diào)用變成了內(nèi)在函數(shù)。(參閱我的“創(chuàng)建有用的內(nèi)在Visual Basic和Microsoft Access函數(shù)”一文中的相關(guān)材料,它們僅適用于早期版本的Visual Basic和Microsoft Access)。由于對(duì)于我的讀者來(lái)說(shuō),類(lèi)型庫(kù)方法是一種新的方法,我會(huì)詳細(xì)逐步進(jìn)行分析。

        類(lèi)型庫(kù)的注冊(cè)

        下列步驟可完成在你注冊(cè)中添加一個(gè)調(diào)用Windows API函數(shù)的類(lèi)型庫(kù)。這樣,該類(lèi)型庫(kù)對(duì)于所有使用VBA的產(chǎn)品都可用,而不僅僅限于你進(jìn)行該函數(shù)注冊(cè)的產(chǎn)品。

        打開(kāi)任何VBA產(chǎn)品(例如,Microsoft Excel 5.0)。

        為了創(chuàng)建一個(gè)模塊,從“插入”菜單中選擇“宏模塊”。

        從“工具”中選擇“引用”。“引用”對(duì)話(huà)框的顯示如圖1。

        圖1:“引用”對(duì)話(huà)框

        假設(shè)你未注冊(cè)Windows API函數(shù)類(lèi)型庫(kù),單擊“瀏覽”按鈕并定位到Win32.TLB,然后單擊“確定”。對(duì)于WIN16.TLB,重復(fù)進(jìn)行這個(gè)步驟。這樣WIN16.TLB和WIN32.TLB都被注冊(cè)。參見(jiàn)圖2。

        圖2:選擇類(lèi)型庫(kù)

        在“瀏覽器”對(duì)話(huà)框關(guān)閉后,滾動(dòng)到“引用”對(duì)話(huà)框的底部,你可以在列表中看到Windows API函數(shù)類(lèi)型庫(kù)(圖3)。

        圖3:Windows API 函數(shù)的注冊(cè)

        關(guān)閉“引用”對(duì)話(huà)框。

        從“視圖”菜單中選擇“對(duì)象瀏覽器”。

        在“對(duì)象瀏覽”對(duì)話(huà)框上,在庫(kù)/工作表下拉列表框中選擇Win(Windows API 函數(shù)類(lèi)型庫(kù))。所有可用的函數(shù)將顯示在對(duì)象/模塊和方法/屬性列表框中(如圖4)。

        圖4:Microsoft Excel 5.0“對(duì)象瀏覽器”顯示Bruce McKinney的Windows API函數(shù)類(lèi)型庫(kù)中可用的對(duì)象和方法

        在對(duì)象/模塊列表框中,選擇“Kernel”;然后在方法/屬性列表框中選擇“GetTickCount”。

        單擊“粘貼”按鈕,GetTickCount出現(xiàn)在模塊中。

        下面示例列出的代碼可實(shí)現(xiàn)在消息框中顯示GetTickCount API調(diào)用的返回值。

        Sub Demo()

        MsgBox Str$(GetTickCount)

        End Sub

        不需要REGISTER命令和Declare語(yǔ)句。上面的代碼就是你所需要的全部代碼。

        類(lèi)型庫(kù)方法解決方案的步驟

        如果你正將解決方案轉(zhuǎn)換為能在16位和32位產(chǎn)品上運(yùn)行的解決方案,我建議你采用下列步驟--假設(shè)Windows API函數(shù)類(lèi)型庫(kù)已注冊(cè):

        假設(shè)你僅使用標(biāo)準(zhǔn)的16位API調(diào)用,刪除你的所有Declare語(yǔ)句;

        檢查“引用”對(duì)話(huà)框中的Wondows API函數(shù)檢查框。

        這就是全部步驟,你已經(jīng)完成了移植。

        類(lèi)型庫(kù)問(wèn)題

        類(lèi)型庫(kù)是一項(xiàng)發(fā)展中的技術(shù),商業(yè)上可用的類(lèi)型庫(kù)還非常少。Bruce先生在使用Windows 3.1 API調(diào)用名設(shè)計(jì)16位和32位產(chǎn)品的類(lèi)型庫(kù)方面,作出了優(yōu)異的工作。盡管如此,類(lèi)型庫(kù)仍存在一些問(wèn)題留待解決。

        Windows API函數(shù)類(lèi)型庫(kù)在VBA中添加了超過(guò)1000個(gè)的新保留詞。所有包含在類(lèi)型庫(kù)中API調(diào)用變成了語(yǔ)言的保留詞。如果你已經(jīng)有一個(gè)名為ordShell的函數(shù),你必須更改它的名稱(chēng),這樣才不會(huì)發(fā)生與類(lèi)型庫(kù)中定義的ordShell函數(shù)的沖突。

        Windows API函數(shù)類(lèi)型庫(kù)不包括需要用戶(hù)定義的類(lèi)型(UDT)的API調(diào)用。這可能在下一版本中得到改善。

        Windows API函數(shù)類(lèi)型庫(kù)方法在Microsoft Excel的speadsheet(電子數(shù)據(jù)表)中是不可用的。

        這種技術(shù)是非常有希望的,并將在開(kāi)發(fā)Office解決方案中簡(jiǎn)化API調(diào)用的使用。

        溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!

        本類(lèi)教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 少妇中文字幕乱码亚洲影视| 亚洲热妇无码AV在线播放| 日韩精品亚洲人成在线观看| 和老外3p爽粗大免费视频| 亚洲中文字幕成人在线| 乱淫片免费影院观看| 亚洲一区精品伊人久久伊人| 一级中文字幕免费乱码专区| 亚洲人成影院在线观看| 国产午夜精品理论片免费观看 | 国产色在线|亚洲| 免费高清小黄站在线观看| 亚洲а∨精品天堂在线| 亚洲国产精品一区二区第四页| 国产免费MV大全视频网站| 亚洲一区二区三区电影| 无码精品A∨在线观看免费| 亚洲日韩av无码中文| 亚洲av无码天堂一区二区三区| WWW免费视频在线观看播放| 久久久久久亚洲精品| 最近中文字幕国语免费完整| 亚洲中文字幕久久精品蜜桃| 免费a级毛片大学生免费观看 | 色噜噜亚洲精品中文字幕| 久久精品人成免费| 亚洲精品美女久久久久久久| 亚洲国产成人久久综合碰| 无码国产精品一区二区免费3p| 中文字幕在线日亚洲9| 国产午夜免费秋霞影院| 免费av片在线观看网站| 男人天堂2018亚洲男人天堂| 亚洲一区二区三区无码影院| 亚洲黄色免费在线观看| 美女被免费视频网站a| 亚洲丝袜美腿视频| 国产资源免费观看| 日韩中文字幕免费视频| 国产精品日本亚洲777| 亚洲成熟xxxxx电影|