User Guide

Table Of Contents
954 Chapter 38: Integrating COM and CORBA Objects in CFML Applications
Ensuring correct threading
Improper threading can cause serious problems when using a COM object in ColdFusion. Make
sure that the object is thread-safe. An object is thread-safe if it can be called from many
programming threads simultaneously, without causing errors.
Visual Basic ActiveX DLLs are typically not thread-safe. If you use such a DLL in ColdFusion,
you can make it thread-safe by using the OLE/COM Object Viewer to change the object’s
threading model to the Apartment model.
If you are planning to store a reference to the COM object in the Application, Session, or Server
scope, do not use the Apartment threading model. This threading model is intended to service
only a single request. If your application requires you to store the object in any of these scopes,
keep the object in the Both threading model, and lock all code that accesses the object, as
described in Chapter 15, “Locking code with cflock,” on page 360.
To change the threading model of a COM Object:
1.
Open the OLE/COM Object Viewer.
2.
Select All Objects under Object Classes in the left pane.
3.
Locate your COM object. The left pane lists these by name.
4.
Select your object.
5.
Select the Implementation tab in the right pane.
6.
Select the Inproc Server tab, below the App ID field.
7.
Select the Threading Model drop down menu and select Apartment or Both, as appropriate.
Using input and output arguments
COM object method in arguments are passed by value. The COM object gets a copy of the
variable value, so you can specify a ColdFusion variable without surrounding it with quotation
marks.
COM object out method arguments are passed by reference. The COM object modifies the
contents of the variable on the calling page, so the calling page can use the resulting value. To pass
a variable by reference, surround the name of an existing ColdFusion variable with quotation
marks. If the argument is a numeric type, assign the variable a valid number before you make the
call. For example:
<cfset inStringArg="Hello Object">
<cfset outNumericArg=0>
<cfset result=myCOMObject.calculate(inStringArg, "outNumericArg")>
The string "Hello Object" is passed to the object's calculate method as an input argument. The
value of outNumericArg is set by the method to a numeric value.