標題標題  顯示論壇會員列表名單  搜索論壇搜索  HelpHelp
  注冊注冊  登入登入
ASP教學區
 DoReMe : ASP教學區
主題 話題: 第二十八章 擴展Active Server Pages 回復發表新主題
作者
貼子內容 << Prev Topic下一個主題 >>
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 12:08下午 | IP記錄 引用 erisa

Internet Information Server的強大功能之一就在於它的可擴展性。因為IIS使用Microsoft的組件對像模型(COM),所以可以用任何語 言創建一個組件,並把它添加到IIS中去。

什麼樣的組件是有用的?這僅限於你的想像力了。以下列表是一些可行性的介紹:

■創建一個複雜的收費計數系統

■添加一個智能鑒定定系統

■從數據庫中抽取圖像

■從ASP中調用Windows API函數

■作為VBScript的替代品

用組件代替編程代碼聽起來有點得不償失,但是有這樣做的商業原因:如果你正在進行開發和銷售ASP站點,沒有其它的途徑可以「編 輯」(隱藏)你的代碼。

因為COM本身是與開發語言無關的,你可以用任何支持DLL動態鏈接庫的語言來開發。這些語言包括Visual Basic,C,Java和COBOL。COBOL是在這裡提及的最有趣的語言之一,通過重複改寫代碼並編譯成DLL可以將它應 用於Internet上!

 

注意

在這章裡將介紹給你一些如何用Visual Basic和Java來創建功能強大的組件的例子,但沒有介紹每種語言的詳細語法結構。如果想對這些語言詳細瞭解的話請參見Vi sual Basic 5 Developers Guide by Tony Mann或Developing Enterprise Apps With Visual J++ by Michael Mitchell。

 

注意

這章主要介紹創建服務器組件。不幸的是,Microsoft 出於市場的考慮將客戶端和服務器端組件部件都命名為ActiveX控件。

 

 

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 12:08下午 | IP記錄 引用 erisa

線程模型:誰該關心?

當一個訪問者連上你的站點,他事實上真正地註冊成為一個用戶(通常命名為IUSR_MACHINE,在這裡MACHINE是你的 計算機的名稱)。這提出了一個新挑戰:如果在同一時間有許多訪問者作相同一件事(作為同一用戶),你的軟件將不能設定事件發生的 順序)。例如,你不能編寫一個用於更新從數據庫中最近一次讀取記錄的組件,如果兩個人同時訪問這個數據庫,那麼你的組件將假定將 要被更新的記錄是上次所讀的,錯誤就會發生!

作為一個組件開發者,你的責任是理解線程模型以及它怎樣影響你的應用程序,你將會看到:Visual Basic的線程同Java的不一樣。

Microsoft的組件對像模型引入了線程安全性這個概念。在以前,每個人都用同時只有一人使用的單用戶Windows工作站 ,Windows NT和Internet改變了這一切。Web服務器可以同時處理多個請求,並且為了得到最優化的服務器效率,代碼和數據連接是以 池的形式出現。這意味著Web請求可能執行代碼的一部分,然後Web請求可能請求相同的代碼做別的事。代碼不用考慮誰請求操作這 種模型叫做自由線程。

不是所有的對象都是自由線程結構的。例如,Visual Basic和Microsoft Access就不是這樣,VB5使用套間模型(見表28.1),而Access使用的是一種高效率的單線程結構。你必鬚根據其線 程模型來確定如何使用一個組件,但是真正的「不安全」對象可以通過與Microsoft Transactions Server包相綁定來為其提更高級別的隔離,從而實現線程安全性。

表28.1 線程模型

模型
 描述
 
單一線程
 設計成單用戶應用程序,所有的過程以線性方式處理,不要將其用於Web應用中。
 
套間線程
 可以作為一個多用戶使用組件,但在同一時間只能有單一線程,不要將其作為系統端對像使用(例如,用於應用程序級), 因為那樣會形成「瓶頸」。VB使用這種模型。
 
自由線程
 作為一個多重使用組件,同一時間允許多個線程運行。J++和C++可以創建這種組件,但編程者需要對線程安全性有根 本的瞭解。
 
所有
 既可以以自由線程也可以以套間線程來操作,這是最理想的。缺省條件下,Java在Microsoft 環境下使用這種模型。
 

 

這章的剩餘部分將通過三個「烹調書籍」的例子來介紹如何建立一個組件,在這些例子裡假定你已經安裝了Visual Basic5或Java編輯器,並且你知道如何在集成開發環境(IDE)中如何操作。

首先我們轉向Java,它比VB複雜的多,同時它功能也更強大。它與C相似,處於Windows API函數更低一級位置。

接下來的兩個例子使用VB,它是創建任何對像最簡單的途徑,但是我們第二個VB 例子將涉及到Windows API函數,以介紹一些高級概念。

技巧

Microsoft將Visual Basic,Visual C++,Visual J++ 等捆綁在一起,以Visual Studio97 的形式出現,這是在單一軟件裡獲得多種開發環境的最值得的途徑。

我們的前兩個例子將用兩種語言來建立相同功能的組件。組件本身並不如典型的產品組件複雜。主要有以下兩個原因:

■產品組件需要額外的錯誤處理代碼,而例子中不需要。

■一個真正的強壯的例子閱讀起來很困難,因為代碼複雜性將阻礙我們的學習。

此組件將一個州的縮寫作為輸入,返回所有州中的滑翔機俱樂部,以表格形式輸出。這難道就不能用VBScript而不通過編寫一個 組件來實現嗎?當然是可以的,但編寫組件的優點就在於我們的代碼是編譯過的,從而達到保持你知識產權的目的。

因為這個組件作為一個會話級對像(每個用戶一個局柄),套間線程是比較適用的,Visual Basic和Java都可以創建套間模型對象,所以兩種工具都適用。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 12:08下午 | IP記錄 引用 erisa

設置開發環境

這節將使用如下四個目錄的網絡站點項目:

SSA

\Root

\Components

\Images

\Script

在這裡只有Scripts和Compoments 目錄被使用,但真正的網點需要以上所有四個目錄。我們的Java組件出於安全原因將安裝於\WinNt\Java\Trustl ib , 但VB組件在這裡顯示的 \Components目錄下。

 

注意

這章中所有的例子代碼都包含在這本書一起發行的CD中。

 

第二章「安裝和使用Internet Information Server」介紹了如何設置IIS。如果你沒有建立過一個網點,複習一下這一章。並且現在立即設置所要的站點目錄,留心第二章 中的「應用程序開發設置」這一段。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 12:09下午 | IP記錄 引用 erisa

用J++創建服務器端組件

J++同C++很相似,都是面向對像語言,Java同C最大區別就在於它的獨立平台性,雖然有人爭論現在的Internet產品 生命週期太短,你根本就沒時間在它變得過時之前在不同的平台上編譯他們。C++對於J++來說仍有速度優勢,雖然之間差距是很小 的。

這節將使用Visual J++ 1.1 作為開發環境,因為Java是可移植的,任何基於Windows的Java編輯器都都適用。唯一特殊的方面是你的組件必需註冊為 一個COM對象,它將引入COM庫,使用Javareg來在 Windows NT中註冊組件。

 

注意

COM是Microsoft的一種技術。出於這種原因,為IIS組件編寫的代碼不能在其它平台上運行。這可能不成問題,因為II S只是在NT上運行。

 

Java組件開發過程遵循以下步驟:


安裝類庫,如果需要的話。


編寫源代碼。


創建項目。


註冊你的組件。


在ASP頁中引用組件。

 

注意

這章將介紹如何用Java來創建組件,而同JavaScript或JScript有很大不同,JavaScript和Jscri pt都是解釋性編程語言,與Java或 J++沒有或很少聯繫。

 

安裝類庫

要為ASP編寫Java應用程序,你必須首先創建類型庫,任何關於 Import asp的引用都會失敗,除非你完成這步操作。(import.asp)是一個Java類庫,它同C裡的以.h結尾的includ e文件類似。

在Visual J++ IDE中選擇Tools|Java|Type Library Wizard,然後選擇Active Server Pages 1.0 Library,單擊OK產生類庫。

 

 

內建對像接口

在前一段中安裝的類庫支持通過IScriptingContext接口與ASP內建對像之間的通信,表28.2列出了類庫所提供 的接口。這些對象的詳細信息將在第三部分Section B-Active Sever Objects中介紹。

表28.2 內建對像接口

接口
 用途
 
IApplication Object
 調用應用程序對象的方法和屬性
 
IRequest
 調用請求對象的方法和屬性
 
IResponse
 調用響應對象的方法和屬性
 
IReadCookie
 返回CooKie集合的內容(只讀)
 
IRequestDictionary
 通過IRequest接口實現對Request對像集合的索引
 
IScriptingContext
 返回同Application,Request,Response,Server或Session 對象的接口
 
IServer
 調用Server對象的方法和屬性
 
IsessionObject
 調用Session對象的方法和屬性
 
IStringList
 從Querystring,Form或Server集合中返回字符串值
 
IwriteCookie
 設置Cookie的內容
 

 

建立組件

使用Explorer創建一個Asp Unleashed 文件夾,它假設在C盤上以c:\AspUnleashed的形式出現。

啟動Visual Studio或J++,選擇File|new顯示工作區對話框,單擊Workspace表欄,輸入Chaper28作為工作區名 稱,將路徑設為:c:\AspUnleashed\chapter28,如圖28.1所示。(如果你已嘗試了Visual Basic例子的話,這個工作區已存在)。

在工作裡需要一個Java項目工程,選擇File|New,單擊Projects表頭,從列表中選擇Java Project並輸入JavaSoaringSites作為項目工程名,如圖28.2所示,確保選擇Add to Current Workspace單選按鈕。

最後創建Java源文件,再次選擇File|New,單擊Files表頭,從列表中選擇JavaSource File並輸入JsoaringSites作為文件名,如圖28.3所示。

 

 

圖28.1 創建chapter28工作區

圖28.2 在chapter28工作區內創建JavaSoaringSites項目工程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

列表28.1是一個簡單的Java日程表組件,錯誤-陷阱在例子中省略,為的是突出重點,在列表28.4只將顯示用Visual Basic編寫的組件代碼。

 

表28.1 JsoaringSites.java

 

------------------------------------------------------------ --------------------
// JSoaringSites// This small Java example demonstrates how to create an// ASP component in Java

import com.ms.com.*;import asp.*;

class JSoaringSites{ IResponse m_iResponse = null; IRequest m_iRequest = null; String m_sReturnString = "";

public void OnStartPage(IScriptingContext objScriptContext) { m_iResponse = objScriptContext.getResponse(); m_iRequest = objScriptContext.getRequest(); }

public void OnEndPage() { m_iResponse = null; m_iRequest = null; }

public void ListSoaringSites(String sState) { Variant vOutput = new Variant(); vOutput.putString("Requested State: "+sState); m_iResponse.Write(vOutput); m_sReturnString = "<P>"; if (sState.equalsIgnoreCase("WA")) { m_sReturnString += "Arlington, WA<BR>"; m_sReturnString += "Burlington, WA<BR>"; m_sReturnString += "Pullman, WA<BR>"; m_sReturnString += "Richland, WA<BR>"; m_sReturnString += "Wenatchee, WA<BR>"; m_sReturnString += "Yakima, WA<BR>"; } else if (sState.equalsIgnoreCase("WI")) m_sReturnString += "<BR>West Bend, WI<BR>"; else m_sReturnString += "No sites found for "+sState; vOutput.putString(m_sReturnString); m_iResponse.Write(vOutput); }}

 

------------------------------------------------------------ --------------------
其中的兩行代碼是Java 的基本組成元素。import com.ms.com.*和import asp.*語句同C中的include文件相似,這個兩語句分別引用了你先前安裝的COM和ASP類庫。

On Start Page和On End Page是兩個特殊的事件,它們在當組件初始化和終止時自動執行。ASP自動調用它們,而不需要你為它們特殊考慮。事實上,這個 組件可以根本不改動這兩個事件的內容。但是,在這個例子裡你可以修改其代碼以便特定的需要,例如你可能希望當網頁打開時組件初始 化就進行數據庫打開操作。

通過使用equalsIgnoreCase 我們就可以將任何大小寫組合匹配作為有效輸入,因此wa,Wa,和WA都可以作為Washington的縮寫。

我們的例子中只涉及到兩個州的信息,所以通過選擇語句可以避免許多不必要的代碼,但在現實生活中,不可能用大量的if語句來列出 開展滑翔機活動的州,這個組件代碼應重新改寫使用數據庫查詢語句,但在這裡我們可以這樣寫

當輸入這些代碼或從CD上拷貝之後,接下來構建此Java組件,然後將這個組件拷貝到WinNT\Java\TrustLib目 錄下,以命令行形式顯示(確信在TrustLib目錄下):

「\Program Files\DevStudio\VJ\Bin\Javareg」

/register/class:JsoaringSites/progid:chapter28.JSoaringSites

 

注意

如果你已經註冊登記了組件,不要忘記在登記最近的組件之前首先鍵入以下的命令行來註銷先前的組件:

「\ProgvamFiles\DevStudio\VJ\Bin\Javareg」 /unregister/calss:JsoaringSites/progid:chapter28.JsoaringSit es

 

通過使用OLEView.exe確保沒有其它的組件在你的Java\bin中註冊。出於某些原因,可能與Visual J++ 1.1不能從所有目錄都註冊成功組件有關——所以註銷工作有時不起作用。如果你在OLEView中發現對這個class的其它引 用,唯一的辦法是搜索到所有的引用這個class的登記文件,然後手來工地刪除它們。每個class有三個引用文件。

 

技巧

OleView是一個很好的跟蹤工具。但有時區分問題很困難,究竟是註冊/構造問題,還是ASP的問題呢?當你在OleView 中雙擊一個class時,你創建了COM對象的一個實例。

如果對像註冊正確,OleView將顯示與組件相聯繫的COM接口,如果OleView顯出一個錯誤信息,可能是一個構造/註冊 問題。

 

注意

在Java1.1或更高版本裡,你不需要將你的組件複製到一個公共目錄中去,因為註冊過程將產生一個你實際所在註冊路徑的映射, 這樣你就可以避免將你所有組件都保存在同一公共目錄中去時可能碰到的麻煩。因為沒有一種工具可以顯示組件是在哪個路徑下註冊的。


以下的兩個ASP頁將使用組件,第一頁是一個簡單的表單,用來接受用戶輸入的不同州的選擇。第二頁將處理請求並將其傳遞給Jav a組件,因為在Java組件中只有兩個州(Washigton 和Wisconsin),所以大多數查詢簡單地返回No Sites found信息。

列表28.2說明了Soaring Sites組件是如何使用的。其中的HTML代碼詢問用戶選擇一個要搜尋滑翔運動俱樂部的州,然後用戶的請求通過HTML的FO RM對像傳遞到列表28.3的代碼。

 

列表28.2 JavaSoaringSites.asp

 

------------------------------------------------------------ --------------------


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Final//EN"><HTML><HEAD> <TITLE>Soaring Sites Results</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">

<CENTER><H1>Soaring Sites</H1></CENTER>

<HR Color="Red"><FORM ACTION="JavaSoaringSitesAction.asp"> Enter a state abbreviation to search for a site: &nbsp; <INPUT NAME="State" SIZE="2"><BR> <INPUT TYPE="SUBMIT"></FORM>

 

------------------------------------------------------------ --------------------
</BODY></HTML>

列表28.3顯示了Jsoaring Sites真正的調用過程,HTML代碼從REQUEST對像(一個內建ASP組件)獲得用戶的請求並將信息通過調用ListS oaringSites方法,來傳遞給在定制的組件。組件本身將格式化的結果以HTML代碼形成返回給頁面。

 

列表28.3 JavaSoaringSitesAction.asp

 

------------------------------------------------------------ --------------------


<% Option Explicit %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>Soaring Sites Results</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">

<CENTER><H1>Soaring Sites</H1></CENTER><HR Color="Red">

<%Dim SoaringSitesSet SoaringSites = Server.CreateObject("Chapter28.JSoaringSites")SoaringSites.L istSoaringSites Request("State")Set SoaringSites = Nothing%>

</BODY></HTML>

技巧

你可以跳過組件註冊,Microsoft已經將這個功能附加在Java 組件中,通過以下形式實現。

Set SoaringSites=Server.Create Object(「Java:Chapter28.JsoaringSites」)

當這本書出版的時候,這項功能還沒有,所以在這章中的例子沒有使用這種增強功能。

 

 

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 12:09下午 | IP記錄 引用 erisa

用Visual Basic來創建服務器端組件

Visual Basic是用來開發一個組件最容易和最快的途徑,其缺點在於自由線程對像不能用VB來編寫,這意味著在這個環境下不適合開發應 用範圍組件。VB4或VB5都適用,我們的例子使用VB5。

以下步驟是創建一個組件所必須的,它比用Java 少一些步驟,這是因為VB不用類庫。

1. 編寫源代碼。

2. 創建項目。

3. 註冊你的組件。

4. 在ASP頁中引用組件。

 

編寫源代碼

啟動一個新的VB5 ActiveX DLL項目,因為我們需要創建一個DLL,不存在用戶界面。VB顯示一個缺省的代碼窗口名叫Class1,按F4並將屬性表按下 面設置:

(Name)VBSoaringSites。

Instancing 5 – MultiUse

如果你使用VB4,將Public設置成True,選擇Project|Project 1 Properties將項目名改為SoaringSites並選中Unattended Execution 選項。最後單擊對話框的Make表欄並選擇Auto Increment,按OK鍵保存設置。

你可能添加一個ASP.DLL作為引用到你項目中去。選擇Projects|References並選擇Microsoft Activc Pages 1.0 Library,如圖28.4所示。我們的VB組件不同於Java組件的一點在於我們不使用OnStartPage和 OnEndPage事件,所以我們可以跳過這個引用。它之所以保存作為例子的一部分是因為你會發現對於其他組件來說,它可能是有 用的。


 

 

 

 

 

例表28.4中的代碼同Java例子不一樣,Java 例子是直接在客戶端輸出,而這個例子將返回一個字符串給ASP頁,然後ASP頁顯示結果。

在SoaringSites Code窗口中輸入源代碼,如表28.4所示。請注意Option Explicit。

 

表28.4 VbSoaringSites 源代碼

 

------------------------------------------------------------ --------------------


Option Explicit

Public Function ListSoaringSites(sState As String) As String Dim sOutput As String

sOutput = "Requested State: " & sState sOutput = sOutput & "<P>"

If UCase(sState) = "WA" Then sOutput = sOutput _ & "Arlington, WA<BR>" _ & "Burlington, WA<BR>" _ & "Pullman, WA<BR>" _ & "Richland, WA<BR>" _ & "Wenatchee, WA<BR>" _ & "Yakima, WA<BR>" ElseIf UCase(sState) = "WI" Then sOutput = sOutput _ & "<BR>West Bend, WI<BR>" Else sOutput = sOutput & "No sites found for " & sState End If

ListSoaringSites = sOutput

 

------------------------------------------------------------ --------------------
End Function

 

在所有步驟都完成之後,你的工程項目看起來應像圖28.5所示。注意你的項目和module名稱,因為操作系統使用你輸入的這些 名稱來註冊組件。

 

 

構建Dll(動態連接庫)

保存你的工作。本CD中的例子使用AspUnleashed\Chapter28\VbSoaringSites作為保存目錄。

選擇File|Make VbSoaringSites DLL來創建DLL。這個組件將保存在同你保存源代碼相同路徑下。將此DLL拷貝到SSA站點的Components目錄,使用 Microsoft Management Console確保這個目錄的屬性包括Run in Separate Memory space使得你可以在以後安裝不同版本的DLL時不需要重起你的計算機(詳細情況請見第二章)。

在命令行中通過以下兩條命令註冊DLL。

cd \ssa\Components

RegSvr32 VbSoaringSites.dll

 

警告

如果這不是你首次註冊這個VbSoaringSite DLL,在將新的版本的組件複製到Components目錄前首先註銷老的DLL,如果不這樣做的結果將會導致註冊表中加入多重 註冊信息,從而需要用乏味的RegEdit來清除其他錯誤的引用。

以下是註銷舊的DLL的命令。

cd \ssa\Components

RegSvr32 /unregister VbSoaringSites.dll

 

在頁面中使用組件

列表28.5中所顯示的代碼與Java 組件代碼的唯一區別在於它調用了另一個不同的ASP頁。列表28.6中顯示了更多的代碼不同,我們在裡面首先提取一個字符串,然 後再使用它,因為VB的DLL並不直接向客戶端作輸出。

 

表28.5 VBSoaringSites.asp

 

------------------------------------------------------------ --------------------


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>Soaring Sites Results</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">

<CENTER><H1>Soaring Sites</H1></CENTER><HR Color="Red">

<FORM ACTION="VBSoaringSitesAction.asp"> Enter a state abbreviation to search for a site: &nbsp; <INPUT NAME="State" SIZE="2"><BR> <INPUT TYPE="SUBMIT"></FORM>

 

------------------------------------------------------------ --------------------
</BODY></HTML>

 

表28.6 VBSoaringSitesAction.asp

 

------------------------------------------------------------ --------------------
<% Option Explicit %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>Soaring Sites Results</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">

<%

Dim oSoaringSites

Dim sSiteList

 

Set oSoaringSites=Server.CreateObject(「SoaringSites.vbSoaringSit es」)

 

『Set the string to return value of function

sSiteList=oSoaringSites.ListSoaringSites(Request(「State」))

 

Response.Write sSiteList 『Display the result

 

Set oSoaringSites=Nothing 『De-reference the object

%>

 

 

------------------------------------------------------------ --------------------
</BODY></HTML>

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 
erisa
Groupie
Groupie


加入: 2005/2月/16
Online Status: Offline
回復: 43
Posted: 2005/2月/16 12:09下午 | IP記錄 引用 erisa

列出服務器上的打印機

以上兩個例子是對組件的很好說明,但是太不值得為這些服務編寫一個組件,除非是出於想隱藏你的工作源代碼的考慮。想像一下你的I ntranet服務器將打印從你的Web應用傳過來的報告,用戶在打印之前需要設置打印機。在這一段中介紹的組件將顯示你系統中 的打印機。你也可以擴展這些代碼來實際選擇一個打印機,並將打印作業發送給它。

 

組件邏輯

這個組件以「硬方式」編寫以便說明如何在VB中調用Wivdons API, 如果你使用VB5中的printer 類也可以實現相同的功能。

這個組件調用了由Windows NT使用的EnumPrinters函數。這個函數以五種格式之一返回一個打印機列表,格式是由你確定的「等級」而定。在這個例 子裡,我們使用第四級,它只是列舉了我們NT服務器所連接的打印機名字和位置(直接連接或網絡連接)。

 

注意

在這裡顯示的組件代碼只適用於Windows NT,如果你在Windows95上運行Personal Web Server的話,使用第五級。Windows 95將網絡打印機當作本地打印機處理。

第五級的打印結構同第四級的有略微的不同之處,使用VB5 API瀏覽器將PRINTER_INFO_5結構體複製到你的代碼中。

 

這是一個功能強大的API調用,可帶許多不同的參數。Visual C的幫助文件提供如何使用EnumPrinters函數的細節,但將C形式的語法翻譯成VB語句可能具有挑戰勝。你可以從www.microsoft.com網點中下載Microsoft Knowledge Base article Q166008來獲得如何翻譯的額外細節信息。

我們將返回信息存在一個長整數組中因為它比其它更低級的儲存結構更便於操作和索引。通過PtrToStr和StrLen調用,我 們能夠將長整數數組轉換成字符串,這種結果在VB中最容易使用。

當確定了有多少打印機與系統相連,我們redim(重定義)兩個數組(m_aDeviceName和m_ServerName) 來存儲所發現打印機數目。如果沒有發現打印機,這些代碼將不會執行,因為錯誤處理代碼將接管程序的執行。

 

編寫源代碼

再一次啟動一個新的VB5 ActiveX DLL項目,VB顯示了一個缺省的代碼窗口名叫Class1,按F4,按以下修改屬性表:

(Name)WebPrinters

Instancing 5 - MultiUse

如果你使用VB4,設置Public為True。

選擇Projects |Project 1 Properties將項目名改為Web Utils,並選擇Unattended Execution。選項最後最後單擊對話框的Make表欄並選擇Auto Increment,按OK鍵保存設置。

列表28.7包含了打印機組件的源代碼,這個組件只是列舉了你系統上的打印機——你可以擴展其代碼事完成實際的打印任務。不像先 前的VB組件,這個例子使用VB的Get 和Let屬性。對這些屬性的討論超過了本例的範圍,但Microsoft』s Visual Books Online(與VB5捆綁在一起)包含了這兩個屬性的深層次解釋。

 

表28.7 WebUtils.WebPrinters原代碼

 

------------------------------------------------------------ --------------------


Option Explicit

Private Declare Function EnumPrinters Lib "winspool.drv" _ Alias "EnumPrintersA" _ (ByVal flags As Long, ByVal name As String, _ ByVal Level As Long, pPrinterEnum As Long, _ ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) _ As Long

Private Declare Function PtrToStr Lib "Kernel32" Alias "lstrcpyA" _ (ByVal RetVal As String, ByVal Ptr As Long) As Long

Private Declare Function StrLen Lib "Kernel32" Alias "lstrlenA" _ (ByVal Ptr As Long) As Long

Private Type PRINTER_INFO_4 pPrinterName As String pServerName As String Attributes As LongEnd Type

Private Const PRINTER_ENUM_LOCAL = &H2Private Const PRINTER_ENUM_CONNECTIONS = &H4Private Const PRINTER_ENUM_NAME = &H8Private Const PRINTER_ENUM_NETWORK = &H40Private Const PRINTER_ENUM_REMOTE = &H10Private Const PRINTER_ENUM_SHARED = &H20

Private m_iPrinterCount As IntegerPrivate m_aDeviceName() As StringPrivate m_aServer() As String

Private Property Let PrinterCount(iValue As Integer) m_iPrinterCount = iValueEnd Property

Public Property Get PrinterCount() As Integer PrinterCount = m_iPrinterCountEnd Property

Private Property Let DeviceName(iIndex As Integer, sValue As String) m_aDeviceName(iIndex) = sValueEnd Property

Public Property Get DeviceName(iIndex As Integer) As String DeviceName = m_aDeviceName(iIndex)End Property

Private Property Let Server(iIndex As Integer, sValue As String) m_aServer(iIndex) = sValueEnd Property

Public Property Get Server(iIndex As Integer) As String Server = m_aServer(iIndex)End Property

Private Sub Class_Initialize() Dim bReturn As Boolean Dim lFlags As Long Dim sName As String Dim lLevel As Long Dim lBuffer() As Long Dim lCdBuf As Long Dim lPcbNeeded As Long Dim lEntries As Long Dim i As Integer Dim lTemp As Long Dim sTempString As String

lFlags = PRINTER_ENUM_CONNECTIONS Or PRINTER_ENUM_LOCAL sName = vbNullString lLevel = 4 lCdBuf = 3072 ReDim lBuffer((lCdBuf \ 4) - 1) As Long

bReturn = EnumPrinters(lFlags, sName, lLevel, lBuffer(0), lCdBuf, lPcbNeeded, lEntries) PrinterCount = lEntries ' Number Printers Found

 

------------------------------------------------------------ --------------------
ReDim m_aDeviceName(PrinterCount) As String ReDim m_aServer(PrinterCount) As String ReDim m_aPaperBin(PrinterCount) As String ReDim m_aPaperSize(PrinterCount) As String For i = 0 To PrinterCount - 1 ' Set the Device Name sTempString = Space(StrLen(lBuffer(i * 3))) lTemp = PtrToStr(sTempString, lBuffer(i * 3)) DeviceName(i) = sTempString ' Set the Server Name sTempString = Space(StrLen(lBuffer(i * 3 + 1))) lTemp = PtrToStr(sTempString, lBuffer(i * 3 + 1)) Server(i) = sTempString Next iEnd Sub

 

創建DLL

將你的工作保存到磁盤上,CD上的例子使用\AspUnleashed\chapter28\Utils。

選擇File|Make WebUtils DLL來創建DLL。這個組件將保存在同你保存源代碼相同路徑下。將此DLL拷貝到SSA站點的Components目錄,使用 Microsoft Management Console確保這個目錄的屬性包括Run in Separate Memory space使得你可以在以後安裝不同版本的DLL時不需要重起你的計算機(詳細情況請見第二章)。

在命令行中通過以下兩條命令註冊DLL。

cd \ssa\Components

RegSvr32 WebUtils.dll

 

在頁面中使用組件

列表28.8中顯示的ASP代碼將列出與你系統相連的所有打印機。通過改寫這些代碼,你可以添加一個下拉列表框,使得用戶在其中 選擇一個打印機,然後將他們的選擇傳遞給你自己的定制組件,將報告輸出到所選的打印機上。

 

表28.8 Printers.asp

 

------------------------------------------------------------ --------------------


<% Option Explicit %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>System Printers</TITLE></HEAD>

<BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica">

<CENTER><H1>Web Server Printers</H1></CENTER><HR Color="Red">

<%Dim oSystemPrintersDim iSet oSystemPrinters = Server.CreateObject("WebUtils.WebPrinters")%>There are <%=oSystemPrinters.PrinterCount%> Server printers<BR><% i = oSystemPrinters.PrinterCount If i > 0 Then For i = 0 to i - 1%>Printer <% =cstr(i + 1) %>: <%=oSystemPrinters.deviceName(cint(i))%><BR>< % Next End IfSet oSystemPrinters = Nothing ' De-reference the object%></BODY></HTML>

 

------------------------------------------------------------ --------------------


總結

組件真是難以置信的強大,花點時間來學習如何創建它們。沒有任何普通的HTML代碼可以與你的新技術相比。

額外的組件信息可以從www.microoft.com/iis中以及在不同的新聞組例如:news://news.extencia.com/aspdeveloper和許多微軟的新聞組例如:news://msnews. microsoft.com中獲到。

Back to Top 查看 erisa's 資料 搜索其他貼子 erisa 訪問 erisa's
 

如果你想回復的話你必須首先 login
如果你還沒有注冊的話你必須首先 注冊

  回復發表新主題
顯示可打印的頁面 顯示可打印的頁面

論壇跳轉
不能 張貼新論題在這個討論版
不能 回應論題在這個討論版
不能 刪除你的發言在這個討論版
不能 編輯你的發言在這個討論版
不能 新增投票標題在這個討論版
不能 在這個討論版投票

Edit by doreme Forums version 2004
Welcome ©2001-2004 doreme Guide

This page was generated in 1.3906 seconds.

 
保養品
保養品, Skin Care
www.elady.tw
Makeups Wholesale
Wholesale Cosmetics SkinCares
lungjyi.com
保養品批發
名牌保養品、保養品批發
www.perfume.com.tw/skincare
Wholesale Perfumes
Fragrances Perfumes Wholesale
lungjyi.net