




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Good is good, but better carries it.精益求精,善益求善。VB封裝DLL實例講解accessexcel代碼保護(hù)-VB封裝DLL實例講解(一講)HYPERLINK/post/107.html/post/107.htmlDLL基本概念(一)概念DLL即動態(tài)鏈接庫(DynamicLinkLibrary),是由可被其它程序調(diào)用的函數(shù)集合組成的可執(zhí)行文件模塊。DLL不是應(yīng)用程序的組成部分,而是運(yùn)行時鏈接到應(yīng)用程序中。(二)主要優(yōu)點:1、多個應(yīng)用程序可以共享一個DLL,而且當(dāng)多個應(yīng)用程序調(diào)用庫的同一個函數(shù)時,可執(zhí)行文件中裝入的只是該函數(shù)的內(nèi)存地址,從而節(jié)省內(nèi)存和磁盤空間;
2、2、使用動態(tài)鏈接庫易于我們維護(hù)用戶程序,即使對動態(tài)鏈接庫進(jìn)行修改也不會影響用戶程序;3、從ACCESS角度而言,還可以更好的確保核心代碼的安全。二、用VB封裝VBA代碼,構(gòu)建自定義的DLL動態(tài)鏈接庫(一)ACCESS中實例代碼下面是一個“快速獲取數(shù)字(Acc).mdb”實例(該實例在文件包中),單擊“提取結(jié)果”按鈕,將文本框中的數(shù)字在彈出消息顯示出來。我將就這個實例演示如何將該實例VBA代碼封裝成為DLL。?按鈕單擊事件代碼如下:PrivateSubCmdFindnumber_Click()DimstrMAsString初始字符串DimstrOutAsString輸出字符串變量DimIstrM
3、=Me.Text1從第一個字符向最后一個字符循環(huán),以提取每個字符ForI=1ToLen(strM)判斷是否為0到9字符,是則賦值輸出IfMid(strM,I,1)Like0-9ThenstrOut=strOut&Mid(strM,I,1)EndIfNextI用MsgBox函數(shù)進(jìn)行輸出測試MsgBoxstrOutEndSubM以上代碼還不能直接用于封裝,須將其修改成為公用函數(shù)(過程)(二)VB封裝實例中VBA代碼步驟一:在VB編輯窗中,點菜單【文件】-【新建工程】,打開新建工程窗口步驟二:修改工程名,這即生成的DLL庫名1、修改工程名為:我的動態(tài)庫步驟三:修改類名1、改類名為:提取數(shù)字步驟四:在
4、代碼窗口輸入如下代碼。將ACCESS中的單擊事件代碼,略做修改成為一個公用函數(shù),然后復(fù)制到VB代碼編輯窗口?代碼如下將這前的ACCESS代碼改成一個公用函數(shù)輸入:strPutString字符串變量,需分離數(shù)字的字符串輸出:fFindNumber字符串變量,得到的數(shù)字字符PublicFunctionfFindNumber(strPutStringAsString)AsStringDimstrOutAsString輸出字符串變量DimI從第一個字符向最后一個字符循環(huán),以提取每個字符ForI=1ToLen(strPutString)判斷是否為0到9字符,是則賦值輸出IfMid(strPutStrin
5、g,I,1)Like0-9ThenstrOut=strOut&Mid(strPutString,I,1)EndIfNextI數(shù)字輸出fFindNumber=strOutEndFunction步驟五:編譯DLL,點菜單【文件】-【生成我的動態(tài)庫.dll】,VBA代碼封裝DLL就完成了。三、在mdb中調(diào)用自定義DLL動態(tài)鏈接庫(一)新建數(shù)據(jù)庫及窗體新建【快速提取數(shù)字(DLL)實例.mdb】數(shù)據(jù)庫,新建一個窗體【frmMain】,在窗體添文本框【text0】,按鈕【CmdFindNum】,Caption屬性:“提取數(shù)字”(見下圖)(二)引用【我的動態(tài)庫.dll】庫按【Alt+F11】打開VBE窗口,
6、點菜單【工具】-【引用】,打開引用對話框,完成對我們自己編譯的DLL的引用。(三)在【CmdFindNum】按鈕單擊事件中加入如下代碼。PrivateSubCmdFindNum_Click()申明自定義類DimMyFindNumAs提取數(shù)字DimstrOutAsString實例化提取數(shù)字類對象SetMyFindNum=New提取數(shù)字將函數(shù)輸出結(jié)果賦值給自定義字符串變量strOut=MyFindNum.fFindNumber(Text0)在消息框中顯示MsgBox你提取的數(shù)字為:&strOut,vbInformation,江羽提示:EndSub點擊保存后,你就可以運(yùn)行一下窗體測試你的成果了M本文
7、實例見實例包,下載測試如果提示錯誤,請重新對自定義類庫進(jìn)行引用。本文只是通過一個簡單的實例演示了,如何通過VB封裝一般的VBA中代碼,因為該代碼中并未涉及到ACCESS應(yīng)用程序?qū)ο螅栽赩B中沒有對ACCESS對象類庫進(jìn)行引用,另外實例中只是簡單演示了,如何手動實現(xiàn)對DLL的注冊引用,在后續(xù)文章中我將就如何實現(xiàn)DLL與ACCESS應(yīng)用程序?qū)蛹癉LL的自動注冊及引用結(jié)合實例進(jìn)行講解。VB封裝DLL實例講解(二講)HYPERLINK/post/106.html/post/106.html上文中我們已經(jīng)就DLL的基本概念,以及如何將VBA代碼封裝為DLL,如何引用該生成的DLL動態(tài)鏈接庫,進(jìn)行了
8、初步的講解,我想大家對于VB封裝DLL應(yīng)該有了一個初步的了解。下面主要就DLL如何實現(xiàn)對ACCESS對象進(jìn)行封裝方法進(jìn)行探討。一、如何在VB中實現(xiàn)對ACCESS對象編程(一)在VB中引用ACCESS對象類庫我們要通過編譯DLLACCESS對象的封裝,首先必須在VB中引用ACCESS對象類庫,這樣我們就可以在VB中,實現(xiàn)對ACCESS應(yīng)用程序中的對象進(jìn)行編程。來實現(xiàn)對打開VB編輯窗口,點菜單【工程】-【引用】,打開【引用對話框】,點選“MicrosoftAccess11.0ObjectLibrary”完成對當(dāng)前版本ACCESS應(yīng)用程序?qū)ο蟮囊谩?實例演示版本為ACCESS2003)M對ACCE
9、SS對象庫的引用很關(guān)鍵,否則我們無法實現(xiàn)對ACCESS對象的編程(二)了解ACCESS對象模型在VB中要對ACCESS對象進(jìn)行編程,還必需對ACCESS所提供的各項對象有一定了解,因為VB就是通過ACCESS對象的方法與屬性,來完成各項操作與設(shè)置,下圖為ACCESS2003的對象部分模型圖例。P上圖為ACCESS2003對象模型,因為篇幅的問題,文中只顯示模型中部分對象,要了解全部對象模型,請大家參閱幫助。(三)VB編程中ACCESSVBA與VB對象表述區(qū)別1、ACCESSVBA與VB的頂層對象都為Application,但在編程中ACCESSVBA頂層對象表述為:Application,而在
10、VB編程中頂層對象用簡寫:App表述(到VB.NET又改回了Application)。?例程:在VB編程中獲得VB及ACCESSVBA獲取當(dāng)前路徑實例:在VB中獲得當(dāng)前路徑:App.Path在VB中獲得ACCESS的當(dāng)前路徑:Application.CurrentProject.PathP在office各應(yīng)用程序之間調(diào)用各組件時,通常在對象前加上庫名,如:Access.Application來表述,但因為VB與ACCESS頂層對象原本表述就存在區(qū)別,在VB中可以直接用Application表述ACCESS應(yīng)用程序?qū)ο螅⒉粫a(chǎn)生沖突的問題。2、ACCESSVBA和VB中部分預(yù)定義類對象(如:窗
11、體、控件等)表述基本相同,以“標(biāo)簽控件”為例,VB與ACCESSVBA均為Label,在VB編程中為了與ACCESS預(yù)定義類對象加以區(qū)別,ACCESS標(biāo)簽對象通常用ACCESS.Label表述。?例程:在VB編程中定義VB及ACCESS標(biāo)簽控件對象實例:在VB中定義VB標(biāo)簽對象:Dimm_LabelAsLabel在VB中定義ACCESS標(biāo)簽對象:Dimm_LabelAsAccess.LabelM在進(jìn)行DLL編程時,特別需注意對象表述區(qū)別的問題,否則無法編譯或是編譯后在ACCESS調(diào)用中報錯。(四)VB編程中關(guān)于ACCESSVBA專屬常量ACCESSVBA專屬常量以“ac”開頭,如:控件類(Ac
12、ControlType)中的文本控件常量為acTextBox,這些常量不一定能被VB所識別,解決辦法通常不使用“常量名”,而直接使用“常量值”,或以輸入?yún)?shù)方式傳遞的方法來解決。?例程:實現(xiàn)隱藏所有文本控件。acTextBox常量值為109。DimctlAsAccess.Control申明ACCESS控件對象DimfrmCltAsAccess.Controls申明ACCESS控件集合遍歷所有ACCESS控件集合,如為文本控件,則不顯示該控件ForEachctlInfrmClt.Controls文本控件類常量值為109,以常量值替代acTextBox常量名Ifctl.ControlType=10
13、9Thenctl.Visible=FalseNextP你可以通過幫助查閱ACCESS專屬常量值,也可以在ACCESSVBA中通過程序方式獲取,如:在立即窗口輸入:?acTextBox回車,就可以acTextBox常量值為:109。二、DLL封裝ACCESS對象實例演示(一)ACCESS的MDB實例MDB實例演示獲得ACCESS版本信息,并在標(biāo)簽Label0中顯示(見下圖),具體參看實例中frmVer6窗體中的代碼,及類模塊ClsVeresion中代碼。Pmdb實例中frmVer1-frmVer6各窗體中具體演示了,代碼按DLL封裝需要整理的思路。?例程:frmVer6窗體加載事件代碼Priva
14、teSubForm_Load()申明自定義類的實例Dimm_VerAsNewClsVeresion調(diào)用自定義類的objAddItem方法m_Ver.objAddItemLabel0EndSub?例程:ClsVeresion類模塊代碼程序功能:定義類接口,將版本信息輸出并在標(biāo)簽中顯示PublicSubobjAddItem(m_labelAsLabel)m_label.Caption=AppVersionEndSub函數(shù)功能:輸出ACCESS版本信息PrivateFunctionAppVersion()AsStringDimstrVerAsString定義字符串變量將版本號賦值給字符串變量strV
15、er=Application.Version根據(jù)版號輸出對應(yīng)版本信息SelectCasestrVerCase8.0AppVersion=Access97Case9.0AppVersion=Access2000Case10.0AppVersion=Access2002Case11.0AppVersion=Access2003Case12.0AppVersion=Access2007EndSelectEndFunction(二)DLL的封裝ACCESS對象實現(xiàn)1、打開VB6.0編輯器,點菜單【新建工程】,在【新建工程】對話框中,點選【ActiveXDLL】,點【確定】。2、修改工程名及類名,實例中
16、我定義的工程名:GetAccVer,類名:ClsAccVer,修改完成以后點選菜單【保存】工程(見下圖)。P工程名就是我們后面將引用的DLL庫名,類模塊名為代碼中我們申明的類名。3、點菜單【工程】-【引用】,打開【引用對話框】,點選“MicrosoftAccess11.0ObjectLibrary”完成對當(dāng)前版本ACCESS應(yīng)用程序?qū)ο蟮囊谩?、將MDB中類模塊ClsVeresion代碼復(fù)制到VB中ClsAccVer類模塊中,按前面我們所述的VB中實現(xiàn)ACCESS對象編程的注意要點略做修改。(見下圖劃紅線部分)P1、因為VB與ACCESSVBA中標(biāo)簽類對象都為Label,因此加上庫名(Acc
17、ess.Label)加以區(qū)別;2、因為VB與ACCESSVBA頂層應(yīng)用程序?qū)ο螅硎鲈揪陀袇^(qū)別,所以無需特別區(qū)分。?例程:ClsAccVer類模塊代碼程序功能:定義DLL接口,將版本信息輸出并在標(biāo)簽實例中顯示PublicSubobjAddItem(m_labelAsAccess.Label)m_label.Caption=AppVersionEndSub函數(shù)功能:輸出ACCESS版本信息PrivateFunctionAppVersion()AsStringDimstrVerAsString定義字符串變量將版本號賦值給字符串變量strVer=Application.Version根據(jù)版號輸出對
18、應(yīng)版本信息SelectCasestrVerCase8.0AppVersion=Access97Case9.0AppVersion=Access2000Case10.0AppVersion=Access2002Case11.0AppVersion=Access2003Case12.0AppVersion=Access2007EndSelectEndFunction4、編譯DLL,點菜單【文件】-【GetAccVer.dll】動態(tài)鏈接庫,封裝DLL就完成了。你現(xiàn)在可以在ACCESS中引用該DLL測試一下看看成果了。參看實例中frmVer7窗體,如實例引用報錯,請重新引用GetAccVer.dll即
19、可。因為受本人認(rèn)知及文字水平所限,不免有錯漏之處,還請大家斧正。本文的Word文稿、VB源碼、MDB實例均在“實例包”中。在后文中我們主要就動態(tài)鏈接庫引用的方法和技巧結(jié)合實例進(jìn)行探討。VB封裝DLL實例講解(三講)HYPERLINK/post/105.html/post/105.html一、手動注冊及引用(一)手動注冊及引用方法(參看實例:手動引用.mdb)進(jìn)入VBA編輯窗口,點菜單【工具】【引用】,打開【引用】對話框,點【瀏覽】按鈕,打開【添加引用】對話框,點選要引用的DLL(測試實例為:ClsFindString.dll),點【打開】點【確定】,我們完成動態(tài)鏈接庫的手動注冊及引用。(二)手
20、動注冊及引用方法不足及問題手動注冊引用優(yōu)點是不言而喻的,方便簡捷,易于操作。但在實際運(yùn)用中,當(dāng)我們在其他電腦上發(fā)布應(yīng)用程序,或運(yùn)行我們測試好的應(yīng)用程序時,卻會出現(xiàn)錯誤提示,程序無法正常運(yùn)行。錯誤(一):找不到工程或庫(見下圖)錯誤的主要原因:DLL在當(dāng)前運(yùn)行的電腦系統(tǒng)中沒有注冊信息,而且引用不正確。錯誤(二):引用的動態(tài)鏈接庫(DLL)丟失(見下圖)進(jìn)入到VBA編輯窗口,點菜單【工具】【引用】,打開【引用】對話框,我們會看到之前引用的DLL動態(tài)鏈接庫丟失。錯誤的主要原因:系統(tǒng)無法找到原路徑引用DLL。錯誤(三):自動化錯誤(見下圖)錯誤的主要原因:我們在發(fā)布應(yīng)用程序的電腦或系統(tǒng)中,雖然重新完成
21、DLL手動注冊和引用,但如果DLL路徑再次改變,運(yùn)行程序時就會出現(xiàn)“自動化錯誤”提示。錯誤(四):ActiveX部件不能創(chuàng)建對象(見下圖)錯誤的主要原因:應(yīng)用程序已正常引用DLL動態(tài)鏈接庫,但其冊注信息丟失或者沒有正常注冊,就會出現(xiàn)以下問題。(三)解決上述錯誤方法1、解決錯誤方法,當(dāng)然是重新進(jìn)行DLL的手動注冊及引用,具體步驟參下圖。但這只是治標(biāo)不治本的辦法,不利于對外發(fā)布我們的應(yīng)用程序,最好的辦法還是通過VBA自動完成DLL的注冊及引用。二、自動注冊及引用方法在探討如何實現(xiàn)DLL自動注冊及引用之前,我們必須清楚一點,那就是DLL的注冊與引用并不是同一事件或行為的兩種不同表述,而是兩種不同的動
22、作。DLL注冊是指將DLL的相關(guān)信息,如:DLL唯一識標(biāo)號(GUID),版本號(Version)及路徑(Path)信息寫入注冊表中,以供系統(tǒng)對DLL進(jìn)行識別調(diào)用。我們通過VB編譯生成DLL時,VB一般會自動完成對該DLL的注冊,但如果要在其它電腦上運(yùn)行程序時,我們就必須重新對該DLL進(jìn)行注冊。DLL引用是指將DLL類庫對象集成到代碼編輯環(huán)境中,以便編程時調(diào)用類庫中的對象、屬性及方法。我們通過手動方式完成DLL的引用時,系統(tǒng)會自動完成對該DLL的注冊,所以我們無需另行對DLL進(jìn)行注冊,但如果我們在其它電腦上運(yùn)行程序時,還會出現(xiàn)我們在之前章節(jié)中所述的錯誤。(一)DLL自動注冊方法我們可以通過Reg
23、svr32.exe來進(jìn)行DLL注冊或反注冊,具體的語法及參數(shù):語法:Regsvr32/u/n/i:cmdlinedllname說明:其中dllname為DLL文件名,建議在發(fā)布時將DLL復(fù)制到system文件夾下。參數(shù):參數(shù)說明/u反注冊/s指定regsvr32安靜運(yùn)行,且不顯示任何消息框。/n指定不調(diào)用DllRegisterServer。此選項必須與/i共同使用。/i:cmdline調(diào)用DllInstall將它傳遞到可選的cmdline。在與/u共同使用時,它調(diào)用dll卸載。dllname指定要注冊的dll文件名。1.1示例通過Shell運(yùn)行Regsvr32程序完成DLL注冊ShellReg
24、svr32/S&Chr(34)&CurrentProject.Path&ClsFindString.dll&Chr(34)Shell函數(shù)用以運(yùn)行Regsver32程序Regsver32注冊程序/S注冊程序參數(shù),書寫時記得參數(shù)前后必須留空Chr(34)Chr函數(shù),獲指定代碼字符,Chr(34)為引號CurrentProject.PathDLL當(dāng)前路徑ClsFindString.dll演示實例DLL名1.2示例通過Shell運(yùn)行Regsvr32程序反注冊ShellRegsvr32/U/S&Chr(34)&CurrentProject.Path&ClsFindString.dll&Chr(34)我們
25、可以將注冊語句放在窗體的加載事件,自動完成DLL的注冊,具體可以參看實例。但如果我們有多個DLL需要批量注冊時,可以考慮通過軟件打包發(fā)布工具來完成DLL的注冊工作;也可以事先編寫B(tài)AT文件,在打包發(fā)布時將該BAT文件一并打包發(fā)布,安裝時運(yùn)行該BAT文件,來完成N個DLL的批量注冊,在此就不多著筆墨,大家可以參看實例包中的BAT文件實例。(二)DLL自動引用方法2.1通過References對象的AddFromFile方法實現(xiàn)自動引用DimrefAsReference申明引用類對象OnErrorResumeNext避免因重復(fù)引用造成的錯誤提示實例化引用對象,完成DLL的引用Setref=Refe
26、rences.AddFromFile(CurrentProject.Path&ClsFindString.dll)為了避免因重復(fù)引用出現(xiàn)的錯誤,我們可以如上代碼中加入Error語句,我們還可以在應(yīng)用程序退出時,通過對References對象的Remove方法釋放DLL或反引用。DimrefAsReference申明引用類對象實例化反引用對象Setref=References(ClsFindString)移除引用指定類庫References.Removeref說明:根據(jù)本人實踐,我個人傾向于使用Error語句,因為如果應(yīng)用程序非正常退出,引用對象沒有反引用成功,啟動時就難免出現(xiàn)重復(fù)引用的錯誤問題。2.2通過DLL唯一標(biāo)識號實現(xiàn)自動引用DimrefAsR
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 5 good manners study skills 教學(xué)設(shè)計2024-2025學(xué)年牛津譯林版八年級英語下冊
- 2020-2021深圳南山實驗學(xué)校初中部小學(xué)四年級數(shù)學(xué)上期末第一次模擬試題帶答案
- 鋼軌彈性支撐施工方案
- 屋頂融雪裝置施工方案
- 醇油漆施工方案
- 樓體加固具體施工方案
- 入駐店鋪合同范本
- 業(yè)務(wù)拓展顧問合同范例
- 產(chǎn)品質(zhì)量控制的年度措施計劃
- 乙方委托設(shè)計合同范本
- 注冊安全工程師培訓(xùn)講義
- 電力合規(guī)管理培訓(xùn)
- 醫(yī)院安全生產(chǎn)治本攻堅三年行動實施方案
- 《自動噴水滅火系統(tǒng)設(shè)計》圖示
- 小升初生涯規(guī)劃
- 第二章陸地和海洋【真題訓(xùn)練】(人教版)(原卷版)
- 小吃街概念性規(guī)劃
- 電商提成合同模板
- 正念八周課件
- 光伏發(fā)電監(jiān)理合同協(xié)議
- 新能源汽車概論課件 3.1認(rèn)知純電動汽車
評論
0/150
提交評論