active|activex 這幾天搞了點c/s結構的程式設計, 由於ASP用得比較熟練,所以VB6.0自然成為我首選的開發工具. 在學習過程中,我結合自己的經驗總結下VB中的一些進階應用程式,並且體會這種應用給我們所帶來的好處.
一、模組 (Module)
在VB中,模組會優先執行,其實說白了,模組就象是全域的過程和函數調用.這是初步的提高代碼可複用性的途徑。我想有經驗的ASP(VBSCRIPT,以後都只用VBScript來寫Asp程式)程式員都用過<!--#Include file=""-->這條語句吧,這對提高代碼的可複用性是比較方便的,在VB裡模組就完成了這個功能.值得注意的是在模組中可以定義Sub Main() 過程,並且在啟動裡面可以讓程式從Main()過程進入.這有點象c,c++中的main()函數. 不過模組的代碼可重用層級還是停留在過程,函數調用上.
二、類別模組
在VB中,可以建立類別模組.類別模組類似於ASP中的類.我想有經驗的Asp程式員應該都有自己的類庫吧.一般情況下我們怎麼在ASP中引用自己的類庫呢?對,還是include,只要把類檔案包含進來就行了. 在調用的時候只要 Set xxx= new ClassName 就行了.這個和ASP中也是一樣的.用類別模組有什麼好處呢? 因為使用類可以定義一些公用的方法和過程,可以將代碼的可重用行達到一個更高的高度.
三、ActiveX技術
可能大家會想,無論是用模組還是類別模組,可能很多功能都會在下一個項目用到.如果這個時候我們需要那些功能的話,可以直接把類別模組和模組代碼考到Vb項目中.在ASP中,我們只要把類代碼做成檔案,然後在其他應用include進來就行了.但有一個問題,那就是代碼的封裝行.因為不論是類別模組還是模組,或者ASP中的寫有類的.asp檔案,代碼可以被人看並加以修改.有沒有辦法能使代碼不讓人看到呢?答案是肯定的,這個就是ActiveX控制項技術. ActiveX 的優點在於可以不同的語言編寫ActiveX控制項,只要符合約定的規範就行,然後可以被其他語言調用.而且代碼是編譯好了的.這個對於ASP來說,可以提高運行速度.好了,廢話少說,下面看看給出一個實際使用的例子吧:
1.首先建立一個ActiveX dll工程,然後把名字寫成TestDll.在類別模組裡的代碼為:
Option Explicit
Private mdbl_augend As Double
Private mdbl_addend As Double
Public Property Get augend() As Double
augend = mdbl_augend
End Property
Public Property Let augend(ByVal vNewValue As Double)
mdbl_augend = vNewValue
End Property
Public Property Get addend() As Double
addend = mdbl_addend
End Property
Public Property Let addend(ByVal vNewValue As Double)
mdbl_addend = vNewValue
End Property
Public Function Plus()
Plus = augend + addend
End Function
2.檔案->產生TestDll.dll. 這樣我們就得到了一個名為TestDll.dll的檔案了,這個就是一個ActiveX控制項了.這個控制項有2個屬性,一個函數.可以計算出2個屬性的和.
3.VB調用TestDll.dll. 建立一個exe工程.工程->引用->瀏覽,選中TestDll.dll檔案,然後隨便拖個按鈕,在按鈕裡寫以下代碼:
Private Sub Command1_Click()
Set objSum = New Sum
objSum.augend = 10.52
objSum.addend = 382.41
Result = objSum.Plus
MsgBox Result
Set objSum = Nothing
End Sub
代碼就不用我解釋了.你可以看到彈出一個對話方塊顯示2個屬性的和.
3.ASP調用TestDll.dll檔案. ASP調用dll檔案和vb也差不多.剛才vb調用時我們要添加一個引用來找到dll檔案.而ASP需要註冊以後才能調用.所以先建立一個setup.bat檔案,裡面寫如下代碼:Regsvr32.exe TestDll.dll 如果這個bat檔案不在TestDll.dll的同級目錄下面,你需要加上TestDll.dll的絕對路徑. 或者直接在運行裡敲Regsvr32.exe E:\website\work\dll\TestDll.dll.這樣TestDll.dll就註冊了,下面我們寫個檔案來測試一下:
<%
Dim objSum
Set objSum = Server.CreateObject("TestDll.Sum")
objSum.augend = 10.52
objSum.addend = 382.41
Result = objSum.Plus
Response.Write Result
Set objSum = Nothing
%>
怎麼樣,網頁上是不是顯示了392.93呢? 這樣ASP就調用了這個TestDll.dll檔案了.
其實在ASP中調用ActiveX控制項可以有很多好處,如果是大型的B/S軟體項目,這樣可以將商務邏輯封裝在ActiveX裡面,而ASP只要調用就行了.唯一的缺點就是需要註冊組件.不過我們有一個變通的方法,在ASP5.0以上可以支援類,我們可以用VBScript的類來代替組件,這樣也能實現封裝,只不過在效能上要慢些. 不過現在.net技術解決這個問題. 因為asp.net是建立在.net framework基礎上的,所以用.net寫出的dll檔案不需要註冊. 具體的以後可以出.net MVC模式的文章同大家探討.
四、API調用.
VB的強大之處就是可以調用WinAPI,這樣原本VB完成不了的功能都可以通過API來完成. 要調用API首先也需要引用它.VB裡提供了一個API Show的小工具給我們使用.這樣可以省去很多調用API的麻煩.要調用API,首先要建立模組,在模組裡申明調用的API,下面我寫一個小程式,就是讓視窗始終顯示在最上面.調用API代碼如下:
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
'常量聲明
Global Const SWP_HIDEWINDOW = &H80
Global Const SWP_NOACTIVATE = &H10
Global Const SWP_NOCOPYBITS = &H100
Global Const SWP_NOMOVE = &H2
Global Const SWP_NOOWNERZORDER = &H200
Global Const SWP_NOREDRAW = &H8
Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Global Const SWP_NOSIZE = &H1
Global Const SWP_NOZORDER = &H4
Global Const SWP_SHOWWINDOW = &H40
Global Const HWND_BOTTOM = 1
Global Const HWND_BROADCAST = &HFFFF&
Global Const HWND_DESKTOP = 0
Global Const HWND_NOTOPMOST = -2
Global Const HWND_TOPMOST = -1
Global Const HWND_TOP = 0
Global Const Flags = SWP_NOMOVE Or SWP_NOSIZE
然後我們在表單裡加如下代碼:
Private Sub Form_Load()
Dim Success As Long
Success = SetWindowPos(Me.hwnd, HWND_TOPMOST, 10, 0, 0, 0, Flags)
End Sub
運行下看看,是不是表單始終在最前面呢?
研究了下VB後發現,其實VB還是提供了一些封裝的技術的.比如模組,類別模組,還有ActiveX,並且VB能夠調用API來彌補自身功能的不足.最主要的是VB簡單易學,而且還提供了很多資料庫操作的控制項.
由於本人用VB用得比較少,有錯誤之處還請指出. http://www.ncycglass.com/blog 有興趣的看看本人的blog,一同探討.