熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP講座之十:自己動手編寫組件

2013-11-13 10:19:06  來源: .NET編程 

   組件編寫速成——編寫組件最基本的步驟
  
  本部分主要講解編寫組件的基本步驟如果你有進一步學習的欲望請參照VB幫助文檔中創建 ActiveX DLL部分(MSDN Library中文檔文件名為Vbconchm)
  
  目的編寫一個最簡單的加法器組件這個組件有兩個屬性一個方法我們從最熟悉的地方開始那就是先假設這個組件已經存在看看在ASP使用該組件的代碼
  
  <%
  Dim objSum
   先創建該組件組件標識為 TestDllSum
  Set objSum = ServerCreateObject(TestDllSum)
   記住TestDllSum 中的TestDllSum
  objSumaugend =     augend 屬性為被加數
  objSumaddend =    addend 屬性為加數
  Result = objSumPlus    Plus 方法求和
  ResponseWrite Result
  Set objSum = Nothing
  %>
  請務必記住這幾個關鍵詞TestDllSumaugendaddendPlus這將與接下來的工作緊密關聯下面是詳細步驟
   運行VB文件菜單中單擊新建工程→在新建工程對話框中雙擊ActiveX DLL圖標→Visual Basic 將向該新工程中自動添加一個類模塊 Class(在工程資源管理器中可以看到如圖
  .按 F 鍵打開屬性窗口雙擊名稱屬性把Class改成 Sum
  .在工程菜單中單擊工程 屬性打開工程屬性對話框工程名稱中填寫TestDll工程描述中填寫創建ActiveX DLL示例如圖
  提示ASP創建組件中的標識TestDLLSum這兩項的意思明白了吧
  .在文件菜單中單擊保存工程分別使用下面的名稱保存工程文件SetupDllcls和SetupDllvbp
  .為 Sum 類創建屬性
  () 在工具菜單中選擇添加過程打開添加過程對話框名稱框中輸入augend單擊屬性然後單擊確定如圖(注意當前焦點應在代碼窗口否則添加過程菜單無效)
  () 在工具菜單中選擇添加過程打開添加過程對話框名稱框中輸入addend單擊屬性然後單擊確定
  .為 Sum 類創建方法
  在工具菜單中單擊添加過程打開添加過程對話框名稱框中輸入Plus在類型中你可以選擇子程序函數本例中由於要返回加數與被加數之和故單擊函數然後單擊確定
  現在前面ASP代碼中的五個關鍵詞語都已用上這下很多東西都明白了吧
  .類模塊Sum代碼窗口中所有代碼如下
  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
  你已經注意到以上代碼與系統生成的代碼有點不同主要是Public Property Get augend() As Variant部分用實際的數據類型Double替代了
  注意實際上當執行 x = objSumaugend 語句時調用的是 Property Get 過程獲取mdbl_augend的值而執行 objSumaugend = 語句時將調用 Property Let 過程賦給 mdbl_augend
  .最後一步文件菜單中單擊生成Dll(K)…生成文件SetupDlldll
  
  到這裡組件已創建好了現在我們可以先在VB中編寫一個測試工程測試一下該文件正確與否
  .在文件菜單中單擊新建工程 →雙擊標准EXE
  .在工程菜單中單擊引用 →在引用對話框中按浏覽按鈕選擇剛剛編譯過的SetupDlldll文件→單擊確定
  .最後在代碼窗口中編寫如下代碼
  Option Explicit
  Private Sub Form_Load()
  Dim objSum As TestDllSum
  Set objSum = New Sum
  
  objSumaugend =
  objSumaddend =
  MsgBox objSumPlus
  End Sub
  運行一下結果正確接下來我們在ASP中使用這個組件將SetupDlldll拷到Web服務器中並用Regsvrexe setupdlldll命令注冊該組件然後在浏覽器中執行本部分開頭的ASP程序如果不行的話你可以嘗試先用VB的打包工具打包然後再安裝組件會自動注冊而且一些必需的VB運行文件也會自動安裝
  說明本部分所有程序均在下載包的Setupdllzip中
  上面的例子中我們使用屬性過程Property Get和Property Let來添加屬性(Property Get讀取屬性的值而Property Let給屬性賦值)若需要對設置的值進行校驗可在Property Let過程編寫適當代碼如下面代碼
  Public Property Let augend(ByVal vNewValue As Double)
  If vNewValue < Then
  MsgBox 搞什麼!小於的值自己心算就行了
  Else
  mdbl_augend = vNewValue
  End If
  End Property
  
   給組件添加屬性和方法的其他途徑
  
  .添加屬性最簡單的一種方法添加公共變量如上例最簡單的代碼如下
  Option Explicit
  Public augend As Double   添加 augend 屬性
  Public addend As Double   添加 addend 屬性
  
  Public Function Plus() As Double
  Plus = augend + addend
  End Function
  但是該方法只能設置可讀/寫屬性且不能對所賦值進行校驗如果僅需添加只讀屬性在上例中刪除Public Property Let augend(ByVal vNewValue As Double)過程則augend便成了一只讀屬性不能賦值當然若要添加只寫屬性只需刪除Property Get過程就可以了
  
  .使用類生成器實用工具
  VB中還有一個添加屬性和方法的工具外接程序菜單中單擊外接程序管理器在跳出的外接程序管理器對話框中選擇VB Class Builder Utility並在加載行為中選擇加載/卸載(如圖然後再在外接程序菜單中單擊類生成器實用工具您一看就會用
  
   告訴你幾個要注意的問題
  
  . 上面的例子是一個簡單得不能再簡單的組件比較實用的組件一般都至少還有一個模塊(Module)
  . 如果不小心 Visual Basic 可產生單線程組件
  也許最常見的一個陷阱就是使用了沒有被設計為在 ASP 下運行的組件單線程組件因此請確保在項目屬性頁的通用選項卡上將線程模塊設置為單元線程
  . 關於類型不匹配錯誤
  一個好的建議是最好聲明 Out 參數為 Variant注意上例中沒有這樣設置
  . 關於全局變量的使用
  盡量避免在組件中使用全局變量在 Visual Basic 術語中這表示在標准的 BAS 模塊中沒有 Public 或 Global 變量因為Global 變量並不是真正意義上的全局每個線程都有自己的副本如果幾種方法恰好在同一線程中執行它們將看到相同的變量否則它們訪問的是這些變量的不同副本這意味著您可能給一個全局變量賦了值(在線程 A 中)但其另一個用戶(在線程 B 中執行)看不到新值其原因是 Visual Basic 內部使用線程本地存儲 (TLS)來引用全局變量這意味著每個線程都有自己的 Public 變量的副本並且因為它存在多個副本全局數據並不是真正全局的也就是說恰好在同一線程中運行的用戶才會訪問到同一個變量不論他們是否期望如此
  
  最後順便提一下VB引入了一種全新的Visual Basic應用程序IIS應用程序你可以象創建ActiveX DLL一樣創建IIS應用程序任何用Active Server Pages創建的應用程序都可以在VB開發環境中創建你可以用單個的VB應用程序完全替代所有的Active Server Pages
From:http://tw.wingwit.com/Article/program/net/201311/13230.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.