Active Server components are a feature of Microsoft Internet Information Server (IIS) that provide a framework for building compiled components that can be used within Web pages. Below are step-by-step instructions for building Active Server components in Visual Basic (VB) 5.0. The process involves Active Server Pages (ASP), another feature of IIS. ASP provides the ability to combine server-side scripting in the same file with HTML, allowing you to use Active Server components and create dynamic Web pages.
Tools
Here are the tools that you need to build Active Server components:
- Windows NT Workstation 4.0
- Visual Basic 5.0 Enterprise Edition
- Internet Information Server 3.0 or later, or Peer Web Services (which is IIS for Windows NT Workstation)
- duct tape (Just kidding.)
Note: You will want to install IIS on your workstation, because VB will need to reference some of the IIS libraries, and you may need to start and stop the Web server during testing.
Construction
Building an Active Server component is not hard. Here are the steps involved in the construction of a small component that performs some simple file IO operations and generates a little HTML:
-
Create an ActiveX DLL project and set the name to “ASCExample”
- Add the following references:
Microsoft Active Server Pages 1.0 Object Library
Microsoft Scripting Runtime
- Add a new class to the project, and set the name to “FileIO”. (Note: This name plus the project name will be used to identify your component in the registry, for example “ASCExample.FileIO”).
- Add this code to the FileIO class.
- Save everything and compile. That’s it.
Testing
Testing your Active Server component is easy (although debugging can get tedious). A few lines of VBScript or JavaScript in an ASP page is all that is required. Here’s the test script:
ASCExample Tester
<% ' Create a FileIO object. set objFileIO = Server.CreateObject("ASCExample.FileIO") %>
<% ' Get some help from the FileIO object. objFileIO.help %>
<%
' Create a file for testing.
strLogFileName = "c:temptest.log"
objFileIO.appendLine strLogFileName, "This is line 1."
%>
strLogFileName = <%= strLogFileName %>
fileExists() => <%= CStr(objFileIO.fileExists(strLogFileName)) %>
fileSize() => <%= objFileIO.fileSize(strLogFileName) %> bytes
<%
' Delete the file.
objFileIO.deleteFile(strLogFileName)
%>
File deleted.
fileExists() => <%= CStr(objFileIO.fileExists(strLogFileName)) %>
[end]
(Note: The <% and %> are used to delimit the server-side scripting.)
To use the test script, do the following:
- Save the script as a file called “ASCExampleTester.asp” in a Web directory that has execute permission.
- Point your browser at
, where the <dir> tag is the name of the Web directory where
http://localhost/<dir>/ASCExampleTester.asp</font>
resides.
ASCExampleTester.asp</font>
When you run the test script, you should get the following output.
Implementation details
Basically, an Active Server component is just a VB class. What makes it different, though, is:
- it is packaged into an ActiveX DLL.
- it implements OnStartPage() and OneEndPage(), which are methods that are called by IIS.
OnStartPage() is called when the component is created and can be used to get references to objects that exist within the context of an ASP page. These objects can then be used for many purposes, such as writing HTML to the response that is sent to the client. This can be seen in the help() method.
OnEndPage() is called when the component is destroyed, which will happen when the current ASP page is completely processed. This method can be used to free resources, release object references (i.e., set them = Nothing), and do other clean up.
Additionally, you should notice that some of the members of the FileIO component are private and some are public. (There are no protected members, since VB does not support inheritance.) As you would expect, only the public members are visible to users of the component. Remember, though, that a good practice in OOP is to make all member variables private and implement public accessor methods for them (e.g., getFoo() and setFoo()).
Tips
Here are two tips that might be helpful when you build some of your own Active Server components:
- When you deploy your components to another server, you will have to copy the DLL to the IIS components directory (which is usually c:winntsystem32inetsrv???) and register the components. You register them with the registration utility, regsvr32.exe (e.g. regsvr32 ASCExample.dll). You don’t have to do this when developing, because VB registers the DLL for you at the end of compilation.
- When you use an Active Server component, IIS locks the DLL (don’t ask me why) and keeps it locked even after the ASP page is processed. If you then try to update the DLL, you will get an “access denied” error. The only way to release the lock is to stop the Web server. So, during development you may be stopping and re-starting the Web server a lot.
Summary
Building Active Server components is not hard, but it does require a high-end development platform that includes Visual Basic 5.0 Enterprise Edition and Internet Information Server running on Windows NT 4.0. In general, construction involves creating classes, implementing a couple of IIS-specific methods, and compiling them into an ActiveX DLL. Additionally, when you have built your components, using them is easier than building them and requires just a few lines of server-side scripting in a Web page.
Related links
Thornton Rose currently works in the MIS department at AGCO Corporation, where he is a software developer and the Webmaster for the intranet. He can be reached via e-mail at trose@avana.net.
ASCExample Tester
Class FileIO
Usage:
Methods:
- help() – shows help
- fileSize(strName) – returns size of named file
- fileExists(strName) – returns True if named file exists
- deleteFile(strName) – deletes named file
- appendLine(strName, strLine) – appends line to file
strLogFileName = c:temptest.log
fileExists() => True
fileSize() => 17 bytes
File deleted.
fileExists() => False [end]
‘ Class FileIO
Option Explicit
Private objApplication As Application ‘ Reference to Application object
Private objResponse As Response ‘ Reference to Response object‘ OnStartPage():
‘
‘ This procedure is called when an instance of this class is created in an
‘ Active Server Page. It gets references to the Application and Response
‘ objects that are being used in the ASP page that created the instance of
‘ this class.
‘
Public Sub OnStartPage(objScriptingContext As ScriptingContext)
Set objApplication = objScriptingContext.Application()
Set objResponse = objScriptingContext.Response()
End Sub‘ OnEndPage():
‘
‘ This procedure is called when an instance of this class is destroyed in
‘ an Active Server Page. It is used to clean up object references.
‘
Public Sub OnEndPage()
Set objApplication = Nothing
Set objResponse = Nothing
End Sub‘ help():
‘
‘ Writes help information to the response stream.
‘
Public Sub help()
objResponse.Write “Class FileIO
” & vbCrLf
objResponse.Write “Usage:” & vbCrLf
objResponse.Write “set o = Server.CreateObject(“”ASCExample.FileIO””) ” & vbCrLf
objResponse.Write “Methods:” & vbCrLf
objResponse.Write “
- ” & vbCrLf
- help() – shows help” & vbCrLf
objResponse.Write “ - fileSize(strName) – returns size of named file” & vbCrLf
objResponse.Write “ - fileExists(strName) – returns True if named file exists” & vbCrLf
objResponse.Write “ - deleteFile(strName) – deletes named file” & vbCrLf
objResponse.Write “ - appendLine(strName, strLine) – appends line to file” & vbCrLf
objResponse.Write “
objResponse.Write “
” & vbCrLf
End Sub
‘ fileSize():
‘
‘ Returns the size of the file with the given name.
‘
Public Function fileSize(strFileName) As Long
fileSize = FileLen(strFileName)
End Function
‘ fileExists():
‘
‘ Returns True if the specified file exists. Note that the given file
‘ specification can contain wildcard characters.
‘
Public Function fileExists(strFileSpec) As Boolean
fileExists = (Dir(strFileSpec) <> “”)
End Function
‘ deleteFile():
‘
‘ Deletes files that match the given file specification, which can include
‘ wildcard characters.
‘
Public Sub deleteFile(strFileSpec)
Call Kill(strFileSpec)
End Sub
‘ appendLine():
‘
‘ Appends a line to a text file (which is handy when working with log
‘ files.)
‘
Public Sub appendLine(strFileName, strLine)
Dim objFileSystem As FileSystemObject
Dim objStream As TextStream
Set objFileSystem = New FileSystemObject
Set objStream = objFileSystem.OpenTextFile(strFileName, 8, True, False)
objStream.WriteLine strLine
objStream.Close
End Sub
‘ End Class FileIO
[end]
–>
Testing
Testing your Active Server component is easy (although debugging can get
tedious). A few lines of VBScript or JavaScript in an ASP page is all
that is required. Here’s the test script:
ASCExample Tester
<% ' Create a FileIO object. set objFileIO = Server.CreateObject("ASCExample.FileIO") %>
<% ' Get some help from the FileIO object. objFileIO.help %>
<%
' Create a file for testing.
strLogFileName = "c:temptest.log"
objFileIO.appendLine strLogFileName, "This is line 1."
%>
strLogFileName = <%= strLogFileName %>
fileExists() => <%= CStr(objFileIO.fileExists(strLogFileName)) %>
fileSize() => <%= objFileIO.fileSize(strLogFileName) %> bytes
<%
' Delete the file.
objFileIO.deleteFile(strLogFileName)
%>
File deleted.
fileExists() => <%= CStr(objFileIO.fileExists(strLogFileName)) %>
[end]