?? 28-5.cfm.htm
字號:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>列出服務器上的打印機</TITLE>
</HEAD>
<BODY>
<B><FONT FACE="宋體" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY">列出服務器上的打印機</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">以上兩個例子是對組件的很好說明,但是太不值得為這些服務編寫一個組件,除非是出于想隱藏你的工作源代碼的考慮。想象一下你的Intranet服務器將打印從你的Web應用傳過來的報告,用戶在打印之前需要設置打印機。在這一段中介紹的組件將顯示你系統中的打印機。你也可以擴展這些代碼來實際選擇一個打印機,并將打印作業發送給它。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋體" LANG="ZH-CN"><P ALIGN="JUSTIFY">組件邏輯</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> 這個組件以“硬方式”編寫以便說明如何在VB中調用Wivdons API, 如果你使用VB5中的printer 類也可以實現相同的功能。</P>
<P ALIGN="JUSTIFY"> 這個組件調用了由Windows NT使用的EnumPrinters函數。這個函數以五種格式之一返回一個打印機列表,格式是由你確定的“等級”而定。在這個例子里,我們使用第四級,它只是列舉了我們NT服務器所連接的打印機名字和位置(直接連接或網絡連接)。</P>
<P ALIGN="JUSTIFY"> </P>
<B><P ALIGN="JUSTIFY">注意</P>
</B><P ALIGN="JUSTIFY"> 在這里顯示的組件代碼只適用于Windows NT,如果你在Windows95上運行Personal Web Server的話,使用第五級。Windows 95將網絡打印機當作本地打印機處理。</P>
<P ALIGN="JUSTIFY">第五級的打印結構同第四級的有略微的不同之處,使用VB5 API瀏覽器將PRINTER_INFO_5結構體復制到你的代碼中。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">這是一個功能強大的API調用,可帶許多不同的參數。Visual C的幫助文件提供如何使用EnumPrinters函數的細節,但將C形式的語法翻譯成VB語句可能具有挑戰勝。你可以從www.microsoft.com網點中下載Microsoft Knowledge Base article Q166008來獲得如何翻譯的額外細節信息。</P>
<P ALIGN="JUSTIFY"> 我們將返回信息存在一個長整數組中因為它比其它更低級的儲存結構更便于操作和索引。通過PtrToStr和StrLen調用,我們能夠將長整數數組轉換成字符串,這種結果在VB中最容易使用。</P>
<P ALIGN="JUSTIFY"> 當確定了有多少打印機與系統相連,我們redim(重定義)兩個數組(m_aDeviceName和m_ServerName)來存儲所發現打印機數目。如果沒有發現打印機,這些代碼將不會執行,因為錯誤處理代碼將接管程序的執行。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋體" LANG="ZH-CN"><P ALIGN="JUSTIFY">編寫源代碼</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> 再一次啟動一個新的VB5 ActiveX DLL項目,VB顯示了一個缺省的代碼窗口名叫Class1,按F4,按以下修改屬性表:</P>
<P ALIGN="JUSTIFY">(Name)WebPrinters</P>
<P ALIGN="JUSTIFY">Instancing 5 - MultiUse</P>
<P ALIGN="JUSTIFY"> 如果你使用VB4,設置Public為True。</P>
<P ALIGN="JUSTIFY">選擇Projects |Project 1 Properties將項目名改為Web Utils,并選擇Unattended Execution。選項最后最后單擊對話框的Make表欄并選擇Auto Increment,按OK鍵保存設置。</P>
<P ALIGN="JUSTIFY">列表28.7包含了打印機組件的源代碼,這個組件只是列舉了你系統上的打印機——你可以擴展其代碼事完成實際的打印任務。不象先前的VB組件,這個例子使用VB的Get 和Let屬性。對這些屬性的討論超過了本例的范圍,但Microsoft</FONT><FONT SIZE=3>’</FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3>s Visual Books Online(與VB5捆綁在一起)包含了這兩個屬性的深層次解釋。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">表28.7 WebUtils.WebPrinters原代碼</P>
<P ALIGN="JUSTIFY"><HR ALIGN="RIGHT" SIZE=1></P>
<P ALIGN="JUSTIFY">Option Explicit</P>
<P ALIGN="JUSTIFY">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</P>
<P ALIGN="JUSTIFY">Private Declare Function PtrToStr Lib "Kernel32" Alias "lstrcpyA" _ (ByVal RetVal As String, ByVal Ptr As Long) As Long</P>
<P ALIGN="JUSTIFY">Private Declare Function StrLen Lib "Kernel32" Alias "lstrlenA" _ (ByVal Ptr As Long) As Long</P>
<P ALIGN="JUSTIFY">Private Type PRINTER_INFO_4 pPrinterName As String pServerName As String Attributes As LongEnd Type</P>
<P ALIGN="JUSTIFY">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</P>
<P ALIGN="JUSTIFY">Private m_iPrinterCount As IntegerPrivate m_aDeviceName() As StringPrivate m_aServer() As String</P>
<P ALIGN="JUSTIFY">Private Property Let PrinterCount(iValue As Integer) m_iPrinterCount = iValueEnd Property</P>
<P ALIGN="JUSTIFY">Public Property Get PrinterCount() As Integer PrinterCount = m_iPrinterCountEnd Property</P>
<P ALIGN="JUSTIFY">Private Property Let DeviceName(iIndex As Integer, sValue As String) m_aDeviceName(iIndex) = sValueEnd Property</P>
<P ALIGN="JUSTIFY">Public Property Get DeviceName(iIndex As Integer) As String DeviceName = m_aDeviceName(iIndex)End Property</P>
<P ALIGN="JUSTIFY">Private Property Let Server(iIndex As Integer, sValue As String) m_aServer(iIndex) = sValueEnd Property</P>
<P ALIGN="JUSTIFY">Public Property Get Server(iIndex As Integer) As String Server = m_aServer(iIndex)End Property</P>
<P ALIGN="JUSTIFY">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</P>
<P ALIGN="JUSTIFY"> lFlags = PRINTER_ENUM_CONNECTIONS Or PRINTER_ENUM_LOCAL sName = vbNullString lLevel = 4 lCdBuf = 3072 ReDim lBuffer((lCdBuf \ 4) - 1) As Long</P>
<P ALIGN="JUSTIFY"> bReturn = EnumPrinters(lFlags, sName, lLevel, lBuffer(0), lCdBuf, lPcbNeeded, lEntries) PrinterCount = lEntries ' Number Printers Found</P>
<P ALIGN="JUSTIFY"><HR ALIGN="LEFT" SIZE=1> 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</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋體" LANG="ZH-CN"><P ALIGN="JUSTIFY">創建DLL</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> 將你的工作保存到磁盤上,CD上的例子使用\AspUnleashed\chapter28\Utils。</P>
<P ALIGN="JUSTIFY">選擇File|Make WebUtils DLL來創建DLL。這個組件將保存在同你保存源代碼相同路徑下。將此DLL拷貝到SSA站點的Components目錄,使用Microsoft Management Console確保這個目錄的屬性包括Run in Separate Memory space使得你可以在以后安裝不同版本的DLL時不需要重起你的計算機(詳細情況請見第二章)。</P>
<P ALIGN="JUSTIFY"> 在命令行中通過以下兩條命令注冊DLL。</P>
<P ALIGN="JUSTIFY">cd \ssa\Components</P>
<P ALIGN="JUSTIFY">RegSvr32 WebUtils.dll</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><B><FONT FACE="宋體" LANG="ZH-CN"><P ALIGN="JUSTIFY">在頁面中使用組件</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> 列表28.8中顯示的ASP代碼將列出與你系統相連的所有打印機。通過改寫這些代碼,你可以添加一個下拉列表框,使得用戶在其中選擇一個打印機,然后將他們的選擇傳遞給你自己的定制組件,將報告輸出到所選的打印機上。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">表28.8 Printers.asp</P>
<P ALIGN="JUSTIFY"><HR ALIGN="LEFT" SIZE=1></P>
<P ALIGN="JUSTIFY"><% Option Explicit %></P>
<P ALIGN="JUSTIFY"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <TITLE>System Printers</TITLE></HEAD></P>
<P ALIGN="JUSTIFY"><BODY BGCOLOR="#FFFFFF"><FONT SIZE="2" FACE="Verdana, Arial, Helvetica"></P>
<P ALIGN="JUSTIFY"><CENTER><H1>Web Server Printers</H1></CENTER><HR Color="Red"></P>
<P ALIGN="JUSTIFY"><%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></P>
<P ALIGN="JUSTIFY"><HR ALIGN="LEFT" SIZE=1></P>
</FONT><B><FONT FACE="宋體" LANG="ZH-CN" SIZE=5><P ALIGN="JUSTIFY">總結</P>
</B></FONT><FONT FACE="宋體" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> 組件真是難以置信的強大,花點時間來學習如何創建它們。沒有任何普通的HTML代碼可以與你的新技術相比。</P>
<P ALIGN="JUSTIFY"> 額外的組件信息可以從www.microoft.com/iis中以及在不同的新聞組例如:news://news.extencia.com/aspdeveloper和許多微軟的新聞組例如:news://msnews. microsoft.com中獲到。</P></FONT></BODY>
</HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -