标题标题  显示论坛会员列表名单  搜索论坛搜索  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 0.2031 seconds.

 
保养品
保养品, Skin Care
www.elady.tw
美材批发
美材, Cosmetic
www.elady.tw/beauty_org
保养品批发
名牌保养品、保养品批发
gb.perfume.com.tw/skincare
饰品批发
饰品、饰品批发
gb.perfume.com.tw/ornament