VB封裝DLL實例(三)

正 文:

一、手動註冊及引用

(一)手動註冊及引用方法(參看實例:手動引用.mdb

進入VBA編輯窗口,點菜單【工具】—【引用】,打開【引用】對話框,點【瀏覽】按鈕,打開【添加引用】對話框,點選要引用的DLL(測試實例爲:ClsFindString.dll),點【打開】—點【確定】,我們完成動態鏈接庫的手動註冊及引用。


(二)手動註冊及引用方法不足及問題

手動註冊引用優點是不言而喻的,方便簡捷,易於操作。但在實際運用中,當我們在其他電腦上發佈應用程序,或運行我們測試好的應用程序時,卻會出現錯誤提示,程序無法正常運行。

錯誤(一)找不到工程或庫(見下圖)

錯誤的主要原因:DLL在當前運行的電腦系統中沒有註冊信息,而且引用不正確。




錯誤(二)引用的動態鏈接庫(DLL)丟失(見下圖)

進入到VBA編輯窗口,點菜單【工具】—【引用】,打開【引用】對話框,我們會看到之前引用的DLL動態鏈接庫丟失。

錯誤的主要原因:系統無法找到原路徑引用DLL




錯誤(三)自動化錯誤(見下圖)

錯誤的主要原因:我們在發佈應用程序的電腦或系統中,雖然重新完成DLL手動註冊和引用,但如果DLL路徑再次改變,運行程序時就會出現“自動化錯誤”提示。


 

錯誤(四):ActiveX部件不能創建對象(見下圖)

錯誤的主要原因:應用程序已正常引用DLL動態鏈接庫,但其冊注信息丟失或者沒有正常註冊,就會出現以下問題。


(三)解決上述錯誤方法

1、解決錯誤方法,當然是重新進行DLL的手動註冊及引用,具體步驟參下圖。但這只是治標不治本的辦法,不利於對外發布我們的應用程序,最好的辦法還是通過VBA自動完成DLL的註冊及引用。



二、自動註冊及引用方法

在探討如何實現DLL自動註冊及引用之前,我們必須清楚一點,那就是DLL的註冊與引用並不是同一事件或行爲的兩種不同表述,而是兩種不同的動作。

 

²        DLL註冊

是指將DLL的相關信息,如:DLL唯一識標號(GUID),版本號(Version)及路徑(Path)信息寫入註冊表中,以供系統對DLL進行識別調用。

我們通過VB編譯生成DLL時,VB一般會自動完成對該DLL的註冊,但如果要在其它電腦上運行程序時,我們就必須重新對該DLL進行註冊。

 

²        DLL引用

是指將DLL類庫對象集成到代碼編輯環境中,以便編程時調用類庫中的對象、屬性及方法。

我們通過手動方式完成DLL的引用時,系統會自動完成對該DLL的註冊,所以我們無需另行對DLL進行註冊,但如果我們在其它電腦上運行程序時,還會出現我們在之前章節中所述的錯誤。

 

(一)DLL自動註冊方法

我們可以通過 Regsvr32.exe 來進行DLL註冊或反註冊,具體的語法及參數:

語法:

Regsvr32 [/u] [/n] [/i[:cmdline]] dllname

說明:其中dllname爲DLL文件名,建議在發佈時將DLL複製到system文件夾下。

參數:

參數

說明

/u

反註冊

/s

指定regsvr32安靜運行,且不顯示任何消息框。

/n

指定不調用DllRegisterServer。此選項必須與/i共同使用。

/i:cmdline

調用DllInstall 將它傳遞到可選的 [cmdline]。在與/u共同使用時,它調用dll卸載。

dllname

指定要註冊的dll文件名。

 

1.1 示例通過Shell運行Regsvr32程序完成DLL註冊        

Shell "Regsvr32 /S " & Chr(34) & CurrentProject.Path & "\ClsFindString.dll" & Chr(34)

Shell 函數                  用以運行Regsver32程序

Regsver32                      註冊程序

/S                                    註冊程序參數,書寫時記得參數前後必須留空

Chr(34)                          Chr函數,獲指定代碼字符,Chr(34)爲引號

CurrentProject.Path    DLL當前路徑

ClsFindString.dll       演示實例DLL

 

1.2 示例通過Shell運行Regsvr32程序反註冊 

Shell "Regsvr32 /U /S " & Chr(34) & CurrentProject.Path & "\ClsFindString.dll" & Chr(34)

 

我們可以將註冊語句放在窗體的加載事件,自動完成DLL的註冊,具體可以參看實例。但如果我們有多個DLL需要批量註冊時,可以考慮通過軟件打包發佈工具來完成DLL的註冊工作;也可以事先編寫BAT文件,在打包發佈時將該BAT文件一併打包發佈,安裝時運行該BAT文件,來完成NDLL的批量註冊,在此就不多着筆墨,大家可以參看實例包中的BAT文件實例。

 

(二)DLL自動引用方法

2.1 通過References對象的AddFromFile方法實現自動引用

 

Dim ref As Reference   '申明引用類對象

On Error Resume Next  '避免因重複引用造成的錯誤提示

'實例化引用對象,完成DLL的引用

Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")

 

 

爲了避免因重複引用出現的錯誤,我們可以如上代碼中加入Error語句,我們還可以在應用程序退出時,通過對References 對象的Remove 方法釋放DLL或反引用。

 

Dim ref As Reference   '申明引用類對象

'實例化反引用對象

Set ref = References("ClsFindString")

'移除引用指定類庫

References.Remove ref

 

說明:根據本人實踐,我個人傾向於使用Error語句,因爲如果應用程序非正常退出,引用對象沒有反引用成功,啓動時就難免出現重複引用的錯誤問題。

 

2.2 通過DLL唯一標識號實現自動引用

 

Dim ref As Reference   '申明引用類對象

On Error Resume Next  '避免因重複引用造成的錯誤提示

'唯一標識號完成註冊,需要DLL標識號,主版本號,次版本

Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0)

 

 

DLL的標識號是編譯生成時就確定了的,這個標識號就是DLL的終生制身份證號,我們可以通過這個唯一標識號來完成DLL自動引用。但此種方法必須具備兩個條件,一是DLL已經成功註冊,二是我們知道了該DLL的標識號、主版本號、次版本號。

 

2.2.1獲取DLL標識號、主版本號、次版本號方法

 

Dim ref As Reference   '申明引用類對象

'實例化引用類庫對象

Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")

Debug.Print ref.GUID    '獲得DLL唯一標識號

Debug.Print ref.Major    '獲得主版本號

Debug.Print ref.Minor    '獲得次版本號

 

 

2.3通過CreateObject方法實現自動引用

 

Dim DllFindStr As Object  '申明對象

'實例化對象爲創建的DLL類庫對象

'ClsFindstringDLL庫名,clsFindStrDLL類名

Set DllFindStr = CreateObject("ClsFindstring.clsFindStr")

       DllFindStr.sFindStr Text2, Me.Text0  '調用DLL類庫方法,運行程序

Set DllFindStr = Nothing              '釋放對象

 

 

根據我本人實踐經驗,CreateObject方法自動引用是最爲便捷高效的方法,僅供參考。

 

關於DLL相關自動註冊及引用方法就探討這裏,以上文字僅是本人實踐的一點總結,希望對大家有所幫助,如有錯漏之處還請大家斧正。本文的Word文稿、DLL源碼(含DLL)、mdb演示實例及BAT註冊文件實例均在實例包中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章