Although in principle a legacy technology, Microsoft's Component Object Model for application development, or COM, is the most widely used specification in the computer world today. Every Windows system relies heavily on the COM architecture as the basis of reusable code. This month's article is the first of two parts that will explore this important technology.
What Is COM?
COM is a specification for creating programs that will run in a language-independent manner under the Microsoft Windows platform. The term COM is also used to refer to the underlying architecture within Windows that makes the technology work. The whole point of the COM strategy is to build and exploit reusable binary code. Such a piece of code, once created, is called a binary COM server and takes the form (usually) of a DLL file.
COM architecture allows a program to work with Windows to find and use routines that are external to the program without regard for programming languages used. For example, a desktop application written in Visual Basic (VB) can run routines written in Visual C++ (VC++) and vice versa. Windows will accommodate the request for external access to a COM server through a mechanism called "cross-process marshalling." This is the internal systems management works within Windows that links and services the requests.
Using a COM Interface
A good way to become familiar with how COM programming works is to see how an external program uses COM technology to accomplish a particular task. A couple of code examples follow to present the case.
Again, the idea is to be able to reuse program code. So if a particular chunk of code, or even a full-blown application, is created to the COM specification, it will be accessible externally from a user-written program. Take, for example, Microsoft Word or Excel. These are well-known standalone applications. But additionally, programs like Word and Excel are created to comply with the COM programming model. This means that these powerful applications can be used as tools to be exploited by my humble homegrown program. Does that mean I can cause my little VB or VC++ program to include the services offered by Word or Excel? It must be a miracle.
The COM Public Interface
So here's how a code library that adheres to the COM architecture is accessed. The code library or application must have a public interface. That is, there must be methods and properties visible to the outside world. The public properties of a COM library can be accessed (set and get) from an external program, and the public methods can be executed from an external program. Although the way that the public interface of a COM server is used is well-specified, the server's actual interface depends on the application.
So how do you know what the public interface is for a COM server? There is published documentation available for most Windows and other commercial applications of the COM specification. Additionally, a code editor like Visual Studio includes tools to help sort out the methods and properties of a COM server.
Figure 1 shows the Object Browser within Visual Studio. Displayed in the browser is the public interface for Microsoft Word.
Figure 1: The public interface for MS Word is displayed in Visual Studio Object Browser. (Click images to enlarge.)
In Figure 1, the Object Browser is displaying only a small portion of the Word public interface. Class names are shown in the left panel, and the corresponding members of the class are on the right. In the example, the method SendMail is highlighted and is a member of the class Document. We know SendMail is a method because of the little green "building block in action" icon next to it. The members with the little hand delivering what looks like a telegram are properties.
Each of the member items listed in the Object Browser for MS Word are part of Word's public interface and are thus available for manipulation from without. COM is a powerful architecture, indeed.
But wait a minute. How does my little VB program know I want to use MS Word as a tool? If you go to your PC and bring up VB6 and start the Object Browser, you will not have access to the Word COM object. Another step must be completed first.
Before you can access the members of a COM server, you must establish a reference to the server's library. In VB6, you do this from the Project menu and then select the References item. The dialog box shown in Figure 2 will be displayed, showing the libraries referenced by your project.
Figure 2: The VB6 project references dialog shows the libraries referenced by your project.
The references dialog shows the usual inclusions for VB plus one other: the Microsoft Word 9.0 Object Library. This is what allows the VB program to be aware of the public members within MS Word. After setting this reference, you should be able to see MS Word members in your Object Browser. It's also interesting to scroll through the list of available references. Each item is a registered COM server on your PC with some sort of public interface, and each can be used as a tool, just like we're doing with Word.
In VB code, Word's functionality is represented as an object. The properties and methods of Word may then be accessed as WordObject.Property or WordObject.Method. The following code sample shows how the Word object comes into existence and how a simple property--the printer that Word is using as the default--is made available to the VB program.
Dim objWord As Word.Application
Dim sWork As String
Set objWord = New Word.Application
sWork = objWord.ActivePrinter
Set objWord = Nothing
End Sub
When this code is executed, a new instance of Word is created and assigned to the program object variable objWord. The methods and properties of the Word object are then available as members. In the example, the ActivePrinter property is accessed and put in the string variable sWork.
Pay special note to the line Set objWord = Nothing. This essential cleanup step releases the Word application from its tie to the VB program and allows it to die a natural death. Without it, orphaned objects will persist and can cause process locks, memory leaks, and other complications.
In the following slightly-more-involved example, Word is being instructed to make itself visible and then open a document. Once the doc is opened, the PrintOut method is invoked, which will print the document on the default printer just as if the user had clicked his way to the same result. Note that making Word visible is optional. If you prefer, you can keep Word tucked under the covers and take all the credit yourself.
Dim objWord As Word.Application
Set objWord = New Word.Application
objWord.Visible = True
objWord.Documents.Open ("C:docmyDoc.doc")
objWord.ActiveDocument.PrintOut
objWord.ActiveDocument.Close
objWord.Visible = False
Set objWord = Nothing
End Sub
If the instance of Word is invisible when the Word object is released, the instance will terminate. If it's visible, the instance of Word will persist until it's closed manually. This is handy when you want to start Word, open a document, and then turn it over to the user for editing.
An Example of Using Word as a COM Object
As an illustration of when to use Word within another application, suppose you want to create a letter for each of your customers, announcing your company's new product. Normally, this could be handled with a Word mailmerge application. But suppose the requirement is a little too tricky for a simple Word mailmerge application, and additional intelligence is required. Let's say the application will have to create slightly different text within each letter for each of several types of customers. Also, for one type of customer, the letter should be emailed, not printed. For all others, the letter should be printed but not emailed. COM technology to the rescue.
OK, that's pretty simple--for a program, that is. A program can get customer data, determine the customer type, and take appropriate action. A program can instruct the Word COM object to create each document correctly and either print or email the result.
Using a Starter Document
It's a common practice in an application like this example to create a Word document to serve as the template or starter doc. This starter doc will contain all the text that will go in the letters, thus sparing the programmer the tedium of inserting and formatting the text programmatically. Also within the starter doc are named tags called "bookmarks." These bookmarks may be cleverly arranged within the document to allow exact spots to be addressed by name from within the program (Figure 3).
Figure 3: Bookmarks are named tags within a Word document.
In Figure 3, note the I-bar symbols. These are the spots within the document where bookmarks have been defined. The figure also shows a new bookmark, GolfCart, being created and placed at the cursor's current position.
When the VB application is run, it will determine the type of text that should be in the letter (baby stroller or golf cart) and delete the other type of text. The program will position the cursor at the named bookmark and remove the incorrect text. (Note that it's easier to remove extra text than to insert new text.) The code below presents a simple illustration.
Dim objWord As Word.Application
Set objWord = New Word.Application
With objWord
.Visible = True
.Documents.Open ("C:docmyDoc.doc")
' Insert the address information...
.Selection.GoTo What:=-1, Name:="Address"
.Selection.Text = myFile!Address1
' Insert the name...
.Selection.GoTo What:=-1, Name:="Name"
.Selection.Text = myFile!firstName
' Remove the text that does not apply...
If myFile!customerType = "Golf" Then
.Selection.GoTo What:=-1, Name:="Stroller"
.Selection.HomeKey Unit:=5
.Selection.MoveDown Unit:=4, Count:=1, Extend:=1
.Selection.Cut
' Send golfers their letter by email...
.ActiveDocument.SendMail
Else
' Similar to above (omitted)...
' Send new parents their letter by regular mail...
.ActiveDocument.PrintOut
End If
.ActiveDocument.SaveAs FileName:="tempdoc.doc", _
AddToRecentFiles:= False
.ActiveDocument.Close
End With
objWord.Visible = False
Set objWord = Nothing
End Sub
This modest chunk of code opens the starter document and then goes to the bookmarked locations within the document and inserts text (the .Selection.GoTo and .Selection.Text statements). Then, the code finds and deletes the extraneous paragraphs within the documents with the .Selection.HomeKey, .Selection.MoveDown, and .Selection.Cut statements. If the customer is a golfer, the document is then emailed (.ActiveDocument.SendMail). Otherwise, the document is sent to the printer (.ActiveDocument.PrintOut).
It doesn't require an overly vivid imagination to see the value in the COM technology specification. With a COM-capable programming language acting as the "pivot man," substantial processing power and flexibility is at hand. But accessing another object's public interface is only part of the picture. Another powerful aspect of the COM architecture allows you to create your own binary COM servers. Next month, we'll continue the discussion of the COM architecture and look into the future of COM in the emerging .NET world.
Chris Peters has 26 years of experience in the IBM midrange and PC platforms. Chris is president of Evergreen Interactive Systems, a software development firm and creators of the iSeries Report Downloader. Chris is the author of The OS/400 and Microsoft Office 2000 Integration Handbook, The AS/400 TCP/IP Handbook, AS/400 Client/Server Programming with Visual Basic, and Peer Networking on the AS/400 (MC Press). He is also a nationally recognized seminar instructor. Chris can be reached at
LATEST COMMENTS
MC Press Online