All Topics  
Component Object Model

 

   Email Print
   Bookmark   Link






 

Component Object Model



 
 
Component Object Model (COM) is an interface standard for software componentry introduced by Microsoft
Microsoft

Microsoft Corporation is a multinational corporation computer technology corporation that develops, manufactures, licenses, and supports a wide range of computer software products for computing devices....
 in 1993. It is used to enable interprocess communication and dynamic object
Object (computer science)

In its simplest embodiment, an object is an allocated region of storage. Since programming languages use variable#Computer_programmings to access objects, the terms object and variable are often used interchangeably....
 creation in a large range of programming languages. The term COM is often used in the software development industry as an umbrella term
Umbrella term

An umbrella term is a word that provides a superset or wikt:grouping of related concepts, also called a hypernym.For example, cryptology is an umbrella term that encompasses cryptography and cryptanalysis, among other fields....
 that encompasses the OLE
Object Linking and Embedding

Object Linking and Embedding is a technology that allows embedding and linking to documents and other objects developed by Microsoft. For developers, it brought OLE custom controls , a way to develop and use custom user interface elements....
, OLE Automation
OLE Automation

In Microsoft Windows applications programming, OLE Automation , is an inter-process communication mechanism based on Component Object Model that was intended for use by scripting languages – originally Visual Basic – but now are used by languages run on Windows....
, ActiveX
ActiveX

ActiveX is a component Object Model developed by Microsoft for Microsoft Windows. By using the Component Object Model runtime, developers can create Component-based software engineering that perform a particular function or a set of functions....
, COM+ and DCOM
Distributed component object model

Distributed Component Object Model is a proprietary software Microsoft technology for communication among software componentry distributed across networked computers....
 technologies.

The essence of COM is a language-neutral way of implementing objects that can be used in environments different from the one they were created in, even across machine boundaries.






Discussion
Ask a question about 'Component Object Model'
Start a new discussion about 'Component Object Model'
Answer questions from other users
Full Discussion Forum



Encyclopedia


Component Object Model (COM) is an interface standard for software componentry introduced by Microsoft
Microsoft

Microsoft Corporation is a multinational corporation computer technology corporation that develops, manufactures, licenses, and supports a wide range of computer software products for computing devices....
 in 1993. It is used to enable interprocess communication and dynamic object
Object (computer science)

In its simplest embodiment, an object is an allocated region of storage. Since programming languages use variable#Computer_programmings to access objects, the terms object and variable are often used interchangeably....
 creation in a large range of programming languages. The term COM is often used in the software development industry as an umbrella term
Umbrella term

An umbrella term is a word that provides a superset or wikt:grouping of related concepts, also called a hypernym.For example, cryptology is an umbrella term that encompasses cryptography and cryptanalysis, among other fields....
 that encompasses the OLE
Object Linking and Embedding

Object Linking and Embedding is a technology that allows embedding and linking to documents and other objects developed by Microsoft. For developers, it brought OLE custom controls , a way to develop and use custom user interface elements....
, OLE Automation
OLE Automation

In Microsoft Windows applications programming, OLE Automation , is an inter-process communication mechanism based on Component Object Model that was intended for use by scripting languages – originally Visual Basic – but now are used by languages run on Windows....
, ActiveX
ActiveX

ActiveX is a component Object Model developed by Microsoft for Microsoft Windows. By using the Component Object Model runtime, developers can create Component-based software engineering that perform a particular function or a set of functions....
, COM+ and DCOM
Distributed component object model

Distributed Component Object Model is a proprietary software Microsoft technology for communication among software componentry distributed across networked computers....
 technologies.

The essence of COM is a language-neutral way of implementing objects that can be used in environments different from the one they were created in, even across machine boundaries. For well-authored components, COM allows reuse of objects with no knowledge of their internal implementation, as it forces component implementers to provide well-defined interfaces that are separate from the implementation. The different allocation semantics of languages are accommodated by making objects responsible for their own creation and destruction through reference-counting
Reference counting

In computer science, reference counting is a technique of storing the number of references, pointers, or handles to a resource such as an object or block of memory....
. Casting
Type conversion

In computer science, type conversion or typecasting refers to changing an entity of one data type into another. This is done to take advantage of certain features of type hierarchies....
 between different interfaces of an object is achieved through the QueryInterface function. The preferred method of inheritance within COM is the creation of sub-objects to which method calls are delegated.

Although the interface standard has been implemented on several platforms, COM is primarily used with Microsoft Windows
Microsoft Windows

Microsoft Windows is a series of software operating systems and graphical user interfaces produced by Microsoft. Microsoft first introduced an operating environment named Windows in November 1985 as an add-on to MS-DOS in response to the growing interest in graphical user interfaces ....
. For some applications, COM has been replaced at least to some extent by the Microsoft .NET
.NET Framework

The Microsoft .NET Framework is a software framework that is available with several Microsoft Windows operating systems. It includes a large Library of coded solutions to prevent common programming problems and a virtual machine that manages the execution of programs written specifically for the Software framework....
 framework, and support for Web Services through the Windows Communication Foundation
Windows Communication Foundation

Windows Communication Foundation, or just WCF, is a programming framework used to build applications that inter-communicate. WCF is the part of the .NET Framework dedicated to communications....
 (WCF). However, COM objects can still be used with all .NET languages without problems. Networked DCOM uses binary proprietary formats, while WCF encourages the use of XML-based SOAP messaging. COM is very similar to other component software interface standards, such as CORBA
Çorba

Chorba , shurpa , sorpa , or shorpo is one of various kinds of soup or stew found in national cuisines across Eurasia. The term is likely of Persian language or Turkic languages origin....
 and Java Beans, although each has its own strengths and weaknesses. It is likely that the characteristics of COM make it most suitable for the development and deployment of desktop applications, for which it was originally designed.

History


One of the first methods of interprocess communication in Windows was DDE
Dynamic Data Exchange

Dynamic Data Exchange is a technology for communication between multiple applications under Microsoft Windows or OS/2....
 that allowed sending and receiving messages in so-called "conversations" between applications. This technology was the base of OLE (Object Linking and Embedding) that in turn was one of the leading technologies introduced with Windows 3.0
Windows 3.0

Windows 3.0 is the third major release of Microsoft Microsoft Windows, and was released on 22 May 1990. It became the first widely successful version of Windows and a powerful rival to Macintosh and the Commodore Amiga on the GUI front....
. Text conversations and Windows messages proved not to be as flexible as to allow sharing application features in a robust and extensible way. By the time version 3.1
Windows 3.1x

Windows 3.1x is a line of operating systems produced by Microsoft for use on personal computers. The line began with Windows 3.1, which was released in March 1992 as a successor to Windows 3.0....
 of Windows was released, COM was created as a new foundation, and OLE changed to OLE2.

Visual Basic
Visual Basic

'Visual Basic' is the third-generation programming language event-driven programming and integrated integrated development environment from Microsoft for its Component Object Model programming model....
 introduced the VBX (packaged extensions in the form of dynamically linked libraries) that allowed the creation of objects to be graphically placed in a form and manipulated by properties and methods. These were later adapted for use by other languages such as Visual C++
Visual C++

Microsoft Visual C++ is a commercial integrated development environment product engineered by Microsoft for the C , C++, and C++/CLI programming languages....
. OLE custom controls (OCXs) would be the replacement for the widely popular VBX.

Antony Williams, one of the more notable thinkers involved in the creation of the COM architecture, distributed a couple of internal papers in Microsoft that embraced the concept of software components; Object Architecture: Dealing With the Unknown – or – Type Safety in a Dynamically Extensible Class Library in 1988 and On Inheritance: What It Means and How To Use It in 1990. These provided the foundation of many, if not all, of the ideas behind the basics of COM.

From many of these ideas spawned Microsoft's first object-based framework, OLE, which is the abbreviation of Object Linking and Embedding
Object Linking and Embedding

Object Linking and Embedding is a technology that allows embedding and linking to documents and other objects developed by Microsoft. For developers, it brought OLE custom controls , a way to develop and use custom user interface elements....
. OLE was built on top of dynamic data exchange
Dynamic Data Exchange

Dynamic Data Exchange is a technology for communication between multiple applications under Microsoft Windows or OS/2....
 (DDE) and designed specifically for compound document
Compound document

In computing, a compound document is a document type typically produced using word processor software, and is a regular text document intermingled with non-text elements such as spreadsheets, pictures, digital videos, digital audio, and other multimedia features....
s. It was introduced with Word for Windows and Excel in 1991, and was later included with Windows, starting with version 3.1 in 1992. An example of a compound document is a spreadsheet embedded in a Word for Windows document; as changes are made to the spreadsheet within Excel, they appear automatically inside the Word document.

In 1991, Microsoft introduced Visual Basic Extension
Visual Basic Extension

In computer programming, a Visual Basic Extension or custom control, was the software component used in Microsoft Visual Basic versions 1.0 to 3.0....
s (VBX) with Visual Basic
Visual Basic

'Visual Basic' is the third-generation programming language event-driven programming and integrated integrated development environment from Microsoft for its Component Object Model programming model....
 1.0.

In 1993, Microsoft released OLE 2 with its underlying object model
Object model

In computing, object model has two related but distinct meanings:# The properties of object in general, in a specific computer programming language, technology, notation or methodology that uses them....
. While OLE 1 was focused on compound documents, COM and OLE 2 were designed to address software components in general. In 1994 OLE controls (OCX) were introduced as the successor to VBX controls. At the same time, Microsoft stated that OLE 2 would just be known as "OLE", and that OLE was no longer an acronym, but a name for all of the company's component technologies.

In early 1996, Microsoft found a new use for OLE Custom Controls, expanding their Web browser's capability to present content, renamed some parts of OLE relating to the Internet
Internet

The Internet is a global network of interconnected computers, enabling users to share information along multiple channels. Typically, a computer that connects to the Internet can access information from a vast array of available server and other computers by moving information from them to the computer's local memory....
 ActiveX, and gradually renamed all OLE technologies to ActiveX, except the compound document technology that was used in Microsoft Office
Microsoft Office

Microsoft Office is a popular set of interrelated desktop applications, servers and services. Microsoft Office is collectively referred to as an office suite, for the Microsoft Windows and Mac OS X operating systems....
. Later that year, DCOM
Distributed component object model

Distributed Component Object Model is a proprietary software Microsoft technology for communication among software componentry distributed across networked computers....
 was introduced as an answer to CORBA
Çorba

Chorba , shurpa , sorpa , or shorpo is one of various kinds of soup or stew found in national cuisines across Eurasia. The term is likely of Persian language or Turkic languages origin....
.

Related technologies

COM was the major software development platform for Windows and, as such, influenced development of a number of supporting technologies.

COM+

In order to provide developers with support for distributed transaction
Distributed transaction

A distributed transaction is an operations bundle, in which two or more network hosts are involved. Usually, hosts provide transactional resources, while the transaction manager is responsible for creating and managing a global transaction that encompasses all operations against such resources....
s, resource pooling, disconnected applications, event publication and subscription, better memory and processor (thread) management, as well as to position Windows as an alternative to other enterprise-level operating systems, Microsoft introduced a technology called Microsoft Transaction Server
Microsoft Transaction Server

Microsoft Transaction Server was software that provided services to Component Object Model Component-based software engineering, to make it easier to create large distributed applications....
 on Windows NT 4.

With Windows 2000, that significant extension to COM was incorporated into the operating system (as opposed to the series of external tools provided by MTS
Microsoft Transaction Server

Microsoft Transaction Server was software that provided services to Component Object Model Component-based software engineering, to make it easier to create large distributed applications....
) and renamed COM+. At the same time, Microsoft deemphasized DCOM
Distributed component object model

Distributed Component Object Model is a proprietary software Microsoft technology for communication among software componentry distributed across networked computers....
 as a separate entity. Transactional COM components were then handled more directly by the added layer of COM+. COM+ components were then added through the Component Services application interface.

An advantage of COM+ was that it could be run in "component farms". A component, if coded properly, could be reused by new calls to its initializing routine without unloading it from memory. Components could also be distributed (called from another machine) as was previously only possible with DCOM.

COM+ also introduced a subscriber/publisher event mechanism called COM+ Events, and provided a new way of leveraging MSMQ (inter-application asynchronous messaging) with components called Queued Components. COM+ events extend the COM+ programming model to support late-bound events or method calls between the publisher or subscriber and the event system.

.NET


The COM platform has largely been superseded by the Microsoft .NET initiative, and Microsoft now focuses its marketing
Marketing

Marketing is defined by the American Marketing Association as the activity, set of institutions, and processes for creating, communicating, delivering, and exchanging offerings that have value for customers, clients, partners, and society at large....
 efforts on .NET. COM was often used to hook up complex, high performance code to front end code implemented in Visual Basic
Visual Basic

'Visual Basic' is the third-generation programming language event-driven programming and integrated integrated development environment from Microsoft for its Component Object Model programming model....
 or ASP
Active Server Pages

Active Server Pages , also known as Classic ASP, was Microsoft's first server-side scripting Active Scripting for dynamic web page. Initially released as an add-on to Internet Information Services via the Windows_NT_4.0#Option_Pack, it was subsequently included as a free component of Windows Server ....
.

To some extent, COM is now deprecated
Deprecation

In computer software standards and documentation, the term deprecation is applied to software features that are superseded and should be avoided....
 in favor of .NET. Since .NET provides rapid development tools similar to Visual Basic for both Windows Forms
Windows Forms

Windows Forms is the name given to the graphical user interface application programming interface included as a part of Microsoft .NET Framework, providing access to the native Microsoft Windows interface elements by wrapping the existing Windows API in managed code....
 and Web Forms
Form (web)

A webform on a web page allows a user to enter data that is sent to a Server for processing. Webforms resemble form because internet users fill out the forms using checkboxes, radio buttons, or menus....
 with just-in-time compilation
Just-in-time compilation

In computing, just-in-time compilation , also known as dynamic translation, is a technique for improving the runtime performance of a computer program....
, back-end code can be implemented in any .NET Language including C#, Visual Basic and C++/CLI
C++/CLI

C++/CLI is Microsoft's language specification intended to supersede Managed Extensions for C++. Completely revised to simplify the older Managed C++ syntax , it provides much more clarity and code readability than Managed C++....
.

Despite this, COM remains a viable technology with an important software base. As of this writing, Microsoft has no plans for discontinuing either COM or support for COM. It is also ideal for script control of applications such as Office or Internet Explorer since it provides an interface for calling COM object methods from a script rather than requiring knowing the API at compile time. The GUID system used by COM has wide uses any time a unique ID is needed.

Several of the services that COM+ provides, such as transaction
Transaction

A transaction is an agreement, communication, or movement carried out between separate entities or objects, often involving the exchange of items of value, such as information, goods, services and money....
s and queued components, are still important for enterprise .NET applications.

There is limited support for backward compatibility. A COM object may be used in .NET by implementing a runtime callable wrapper (RCW). .NET objects that conform to certain interface restrictions may be used in COM objects by calling a COM callable wrapper (CCW). From both the COM and .NET sides, objects using the other technology appear as native objects. See COM Interop
COM Interop

COM Interop is a technology included in the .NET Common Language Runtime that enables Component Object Model objects to interact with .NET objects, and vice versa....
.

.NET's remoting model
.NET Remoting

.NET Remoting is a Microsoft application programming interface for Inter-process communication released in 2002 with the 1.0 version of .NET Framework....
 solves a number of COM's remote execution shortcomings, allowing objects to be transparently marshalled by reference or value across process or machine boundaries.

Internet security

Microsoft's idea of embedding active content on web pages as COM/ActiveX components (rather than e.g. Java applets) created a combination of problems in the Internet Explorer
Internet Explorer

Windows Internet Explorer , commonly abbreviated to IE, is a series of graphical user interface web browsers developed by Microsoft and included as part of the Microsoft Windows line of operating systems starting in 1995....
 web browser that has led to an explosion of computer virus
Computer virus

A computer virus is a computer program that can copy itself and infect a computer without the permission or knowledge of the user. The term "virus" is also commonly but erroneously used to refer to other types of malware, adware and spyware programs that do not have the reproductive ability....
, trojan
Trojan horse (computing)

The Trojan horse, also known as trojan, in the context of computer software, describes a class of computer threats that appears to perform a desirable function but in fact performs undisclosed malicious functions that allow unauthorized access to the host machine, giving them the ability to save their files on the user's computer...
 and spyware
Spyware

Spyware is computer software that is installed wikt:surreptitiously on a personal computer to intercept or take partial control over the user's interaction with the computer, without the user's informed consent....
 infections. These malware
Malware

Malware, a portmanteau from the words Malice and Computer software, is software designed to infiltrate or damage a computer system without the owner's informed consent....
 attacks mostly depend on ActiveX for their activation and propagation to other computers. Microsoft recognized the problem with ActiveX as far back as 1996 when Charles Fitzgerald, program manager of Microsoft's Java team said "If you want security on the 'Net', unplug your computer. … We never made the claim up front that ActiveX is intrinsically secure." As COM and ActiveX components are run as native code on the user's machine, there are fewer restrictions on what the code can do. Many of these problems have been addressed by the introduction of "Authenticode" code signing
Code signing

Code signing is the process of digitally digital signature executables and scripting language to confirm the software author and guarantee that the code has not been altered or corrupted since it was signed by use of a Cryptographic hash function....
 (based on digital signature
Digital signature

A digital signature or digital signature scheme is a type of asymmetric key algorithm. For messages sent through an insecure channel, a properly implemented digital signature gives the receiver reason to believe the message was sent by the claimed sender....
s), and later by the .NET
.NET Framework

The Microsoft .NET Framework is a software framework that is available with several Microsoft Windows operating systems. It includes a large Library of coded solutions to prevent common programming problems and a virtual machine that manages the execution of programs written specifically for the Software framework....
 platform as well. Also, before an ActiveX control is installed, the user is prompted whether to allow the installation or not, enabling the user to disallow the installation of controls from sites that the user doesn't trust. Additionally, it is possible to disable ActiveX controls altogether, or to only allow a selected few.

Technical details

COM programmers build their software using COM-aware components. Different component types are identified by class IDs (CLSIDs), which are Globally Unique Identifier
Globally Unique Identifier

A globally unique identifier or GUID is a special type of identifier used in software applications in order to provide a reference number which is unique in any context , for example, in defining the internal reference for a type of access point in a software application, or for creating unique database keys in a database....
s, or GUIDs. Each COM component exposes its functionality through one or more interfaces
Interface (computer science)

Interface generally refers to an Abstraction_%28computer_science%29 that an entity provides of itself to the outside. This separates the methods of external communication from internal operation, and allows it to be internally modified without affecting the way outside entities interact with it, as well as provide Polymorphism in object-orien...
. The different interfaces supported by a component are distinguished from each other using interface IDs (IIDs), which are also GUIDs
Globally Unique Identifier

A globally unique identifier or GUID is a special type of identifier used in software applications in order to provide a reference number which is unique in any context , for example, in defining the internal reference for a type of access point in a software application, or for creating unique database keys in a database....
.

COM interfaces have bindings
Binding (computer science)

In computer science, binding is the creation of a simple reference to something that is larger and more complicated and used frequently. The simple reference can be used instead of having to repeat the larger thing....
 in several languages, such as C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
, C++
C++

C++ is a general-purpose programming language. It is regarded as a middle-level language, as it comprises a combination of both high-level programming language and low-level programming language language features....
, Visual Basic
Visual Basic

'Visual Basic' is the third-generation programming language event-driven programming and integrated integrated development environment from Microsoft for its Component Object Model programming model....
, and several of the scripting languages implemented on the Windows platform. All access to components is done through the methods
Method (computer science)

In object-oriented programming, a method is a subroutine that is exclusively associated either with a class or with an object . Like a procedure in procedural programming languages, a method usually consists of a sequence of statement to perform an action, a set of input parameter to customize those actions, and possibly an output value...
 of the interfaces. This allows techniques such as inter-process, or even inter-computer programming (the latter using the support of DCOM
Distributed component object model

Distributed Component Object Model is a proprietary software Microsoft technology for communication among software componentry distributed across networked computers....
).

Interfaces

All COM components must (at the very least) implement the standard IUnknown
IUnknown

In programming, the IUnknown interface is the fundamental interface in the Component Object Model . The published mandates that COM objects must minimally implement this interface....
interface, and thus all COM interfaces are derived
Inheritance (computer science)

In object-oriented programming, inheritance is a way to form new class es using classes that have already been defined. The inheritance concept was invented in 1967 for Simula....
 from IUnknown. The IUnknown interface consists of three methods: AddRef and Release, which implement reference counting
Reference counting

In computer science, reference counting is a technique of storing the number of references, pointers, or handles to a resource such as an object or block of memory....
 and controls the lifetime of interfaces; and QueryInterface, which by specifying an IID allows a caller to retrieve references to the different interfaces the component implements. The effect of QueryInterface is similar to dynamic cast
Dynamic cast

In the C++ programming language, the dynamic_cast operator is a part of the run-time type information system that performs a type conversion....
<>
in C++
C++

C++ is a general-purpose programming language. It is regarded as a middle-level language, as it comprises a combination of both high-level programming language and low-level programming language language features....
 or casts
Type conversion

In computer science, type conversion or typecasting refers to changing an entity of one data type into another. This is done to take advantage of certain features of type hierarchies....
 in Java
Java (programming language)

Java is a programming language originally developed by James Gosling at Sun Microsystems and released in 1995 as a core component of Sun Microsystems' Java ....
 and C#.

A COM component's interfaces are required to exhibit the reflexive, symmetric, and transitive
Equivalence relation

In mathematics, an equivalence relation is, loosely, a binary relation on a Set that specifies how to split up the set into subsets such that every element of the larger set is in exactly one of the subsets....
 properties. The reflexive property refers to the ability for the QueryInterface call on a given interface with the interface's ID to return the same instance of the interface. The symmetric property requires that when interface B is retrieved from interface A via QueryInterface, interface A is retrievable from interface B as well. The transitive property requires that if interface B is obtainable from interface A and interface C is obtainable from interface B, then interface C should be retrievable from interface A.

An interface consists of a pointer to a virtual function table
Virtual method table

A virtual method table, virtual function table, dispatch table, or vtable, is a mechanism used in programming language to support dynamic dispatch ....
 that contains a list of pointers to the functions that implement the functions declared in the interface, in the same order that they are declared in the interface. This technique of passing structures of function pointers is very similar to the one used by OLE 1.0
Object Linking and Embedding

Object Linking and Embedding is a technology that allows embedding and linking to documents and other objects developed by Microsoft. For developers, it brought OLE custom controls , a way to develop and use custom user interface elements....
 to communicate with its system libraries.

COM specifies many other standard interfaces used to allow inter-component communication. For example, one such interface is IStream, which is exposed by components that have data stream semantics
Semantics

Semantics is the study of meaning in communication. The word is derived from the Greek language word s??a?t???? , "significant", from s??a??? , "to signify, to indicate" and that from s??a , "sign, mark, token"....
 (e.g. a FileStream component used to read or write files). It has the expected Read and Write methods to perform stream reads and writes. Another standard interface is IOleObject, which is exposed by components that expect to be linked or embedded into a container. IOleObject contains methods that allow callers to determine the size of the component's bounding rectangle, whether the component supports operations like 'Open', 'Save' and so on.
Classes
A class is COM's language-independent way of defining a class in the object-oriented sense.

A class can be a group of similar objects or a class is simply a representation of a type of object; think of it as a blueprint that describes the object.

A coclass supplies concrete implementation(s) of one or more interfaces. In COM, such concrete implementations can be written in any programming language that supports COM component development, e.g. Delphi, C++, Visual Basic, etc.

One of COM's major contributions to the world of Windows development is the awareness of the concept of separation of interface from implementation. An extension of this fundamental concept is the notion of one interface, multiple implementations. This means that at runtime, an application can choose to instantiate an interface from one of many different concrete implementations.

Interface Definition Language and type libraries

Type libraries contain metadata that represent COM types. However, these types must first be described using Microsoft Interface Definition Language.

This is the common practice in the development of a COM component, i.e. to start with the definition of types using IDL. An IDL file is what COM provides that allows developers to define object-oriented classes, interfaces, structures, enumerations and other user-defined types in a language independent manner. COM IDL is similar in appearance to C/C++ declarations with the addition of keywords such as "interface" and "library" for defining interfaces and collections of classes, respectively. IDL also requires the use of bracketed attributes before declarations to provide additional information, such as the GUIDs of interfaces and the relationships between pointer parameters and length fields.

The IDL file is compiled by the MIDL compiler into a pair of forms for consumption from various languages. For C/C++, the MIDL compiler generates a compiler-independent header file containing struct definitions to match the vtbl
Virtual method table

A virtual method table, virtual function table, dispatch table, or vtable, is a mechanism used in programming language to support dynamic dispatch ....
s of the declared interfaces and a C file containing declarations of the interface GUIDs
Globally Unique Identifier

A globally unique identifier or GUID is a special type of identifier used in software applications in order to provide a reference number which is unique in any context , for example, in defining the internal reference for a type of access point in a software application, or for creating unique database keys in a database....
. C++ source code for a proxy module can also be generated by the MIDL compiler. This proxy contains method stubs for converting COM calls into Remote Procedure Call
Remote procedure call

Remote procedure call is an Inter-process communication technology that allows a computer program to cause a subroutine or procedure to execute in another address space without the programmer explicitly coding the details for this remote interaction....
s, thus enabling DCOM.

An IDL file may also be compiled by the MIDL
MIDL

Microsoft Interface Definition Language is a text-based interface description language by Microsoft, based on the DCE/RPC IDL. Its compiler is also called MIDL....
 compiler into a type library (.TLB file). The binary metadata contained within the type library is meant to be processed by language compilers and runtime environments (e.g. VB, Delphi, the .NET CLR etc). The end result of such TLB processing is that language-specific constructs are produced that represent the COM class defined in the .TLB (and ultimately that which was defined in the originating IDL file).

COM as an object framework

The fundamental principles of COM have their roots in Object-Oriented philosophies. It is a platform for the realization of Object-Oriented Development and Deployment.

Because COM is a runtime framework, types have to be individually identifiable and specifiable at runtime. To achieve this, globally unique identifiers (GUIDs) are used. Each COM type is designated its own GUID for identification at runtime (versus compile time).

In order for information on COM types to be accessible at both compile time and runtime, COM uses type libraries. It is through the effective use of type libraries that COM achieves its capabilities as a dynamic framework for the interaction of objects.

Consider the following example coclass definition in an IDL : coclass MyObject ; The above code fragment declares a COM class named MyObject which must implement an interface named IMyObject and which supports (not implements) the event interface _IMyObjectEvents.

Ignoring the event interface bit, this is conceptually equivalent to defining a C++ class like this: class CSomeObject : public ISomeInterface ; where ISomeInterface is a C++ pure virtual class.

Referring once again to the MyObject COM class: once a coclass definition for it has been formalized in an IDL, and a Type Library compiled from it, the onus is on the individual language compiler to read and appropriately interpret this Type Library and then produce whatever code (in the specific compiler's language) necessary for a developer to implement and ultimately produce the binary executable code which can be deemed by COM to be of coclass MyObject.

Once an implementation of a COM coclass is built and is available in the system, next comes the question of how to instantiate it. In languages like C++, we can use the CoCreateInstance API in which we specify the CLSID (CLSID_MyObject) of the coclass as well as the interface (specified by the IID IID_IMyObject) from that coclass that we want to use to interact with that coclass. Calling CoCreateInstance like this: CoCreateInstance(CLSID_MyObject, NULL, CLSCTX_INPROC_SERVER, IID_IMyObject, (void**)&m_pIMyObject); is conceptually equivalent to the following C++ code: ISomeInterface* pISomeInterface = new CSomeObject; In the first case, we are saying to the COM sub-system that we want to obtain a pointer to an object that implements the IMyObject interface and we want coclass CLSID_MyObject's particular implementation of this interface. In the second case, we are saying that we want to create an instance of a C++ class that implements the interface ISomeInterface and we are using CSomeObject as that C++ class.

A coclass, then, is an object-oriented class in the COM world. The main feature of the coclass is that it is (1) binary in nature and consequently (2) programming language-independent.

Registry

In Windows, COM classes, interfaces and type libraries are listed by GUIDs in the registry
Windows registry

The Windows Registry is a directory which stores settings and options for Microsoft Windows operating systems. It contains information and settings for all the hardware, operating system software, most non-operating system software, and per-user settings....
, under HKEY_CLASSES_ROOT\CLSID for classes and HKEY_CLASSES_ROOT\interface for interfaces. The COM libraries use the registry to locate either the correct local libraries for each COM object or the network location for a remote service.

Reference counting

The most fundamental COM interface of all, i.e. IUnknown (from which all COM interfaces must be derived), supports two main concepts: feature exploration through the QueryInterface method, and object lifetime management by including AddRef and Release. Reference counts and feature exploration apply to objects (not to each interface on an object) and thus must have a centralized implementation.

The COM specifications require a technique called reference counting
Reference counting

In computer science, reference counting is a technique of storing the number of references, pointers, or handles to a resource such as an object or block of memory....
 to ensure that individual objects remain alive as long as there are clients which have acquired access to one or more of its interfaces and, conversely, that the same object is properly disposed of when all code that used the object have finished with it and no longer require it. A COM object is responsible for freeing its own memory once its reference count drops to zero.

For its implementation, a COM Object usually maintains an integer value that is used for reference counting. When AddRef is called via any of object's interfaces, this integer value gets incremented. When Release is called, this integer gets decremented. AddRef and Release are the only means by which a client of a COM object is able to influence its lifetime. The internal integer value remains a private member of the COM object and will never be directly accessible.

The purpose of AddRef is to indicate to the COM object that an additional reference to itself has been affected and hence it is necessary to remain alive as long as this reference is still valid. Conversely, the purpose of Release is to indicate to the COM object that a client (or a part of the client's code) has no further need for it and hence if this reference count has dropped to zero, it may be time to destroy itself.

Certain languages (e.g. Visual Basic) provide automatic reference counting so that COM object developers need not explicitly maintain any internal reference counter in their source codes. Using COM in C, explicit reference counting is needed. In C++ you can do it by yourself or choose to use a smart pointer that will manage all the reference counting for you.

The following is a general guideline calling AddRef and Release to facilitate proper reference counting in COM object:
  • Functions (whether object methods or global functions) that return interface references (via return value or via "out" parameter) should increment the reference count of the underlying object before returning. Hence internally within the function or method, AddRef is called on the interface reference (to be returned). An example of this is the QueryInterface method of the IUnknown interface. Hence it is imperative that developers be aware that the returned interface reference has already been reference count incremented and not call AddRef on the returned interface reference yet another time.
  • Release must be called on an interface reference before that interface's pointer is overwritten or goes out of scope.
  • If a copy is made on an interface reference pointer, AddRef should be called on that pointer. After all, in this case, we are actually creating another reference on the underlying object.
  • AddRef and Release must be called on the specific interface which is being referenced since an object may implement per-interface reference counts in order to allocate internal resources only for the interfaces which are being referenced.
  • Extra calls to these functions are not sent out to remote objects over the wire; a proxy keeps only one reference on the remote object and maintains its own local reference count.


To facilitate and promote COM development, Microsoft introduced ATL (Active Template Library)
Active Template Library

The Active Template Library is a set of template-based C++ classes developed by Microsoft that simplify the programming of Component Object Model objects....
 for C++ developers. ATL provides for a higher-level COM development paradigm. It also shields COM client application developers from the need to directly maintain reference counting by providing smart pointer
Smart pointer

In computer science, a smart pointer is an abstract data type that simulates a pointer while providing additional features, such as garbage collection or bounds checking....
 objects.

Other libraries and languages that are COM-aware include the Microsoft Foundation Classes, the Compiler COM Support, VBScript
VBScript

VBScript is an Active Scripting language, developed by Microsoft, which uses the Component Object Model to access elements of the environment within which it's running ....
, Visual Basic
Visual Basic

'Visual Basic' is the third-generation programming language event-driven programming and integrated integrated development environment from Microsoft for its Component Object Model programming model....
, ECMAScript
ECMAScript

ECMAScript is a scripting language, standardized by Ecma International in the ECMA-262 Specification . The language is widely used on the World Wide Web, and is often confused with JavaScript or JScript, the two major Programming language dialect from which ECMAScript was standardized....
 (JavaScript
JavaScript

JavaScript is a scripting language widely used for client-side web development. It was the originating Programming language dialect of the ECMAScript standard....
) and Borland Delphi
Borland Delphi

Delphi is a software development environment for Microsoft Windows applications. It has always supported development of native Windows applications in the Delphi programming language, a further development of Object Pascal....
.

Instantiation

COM standardizes the instantiation (i.e. creation) process of COM objects by requiring the use of Class Factories. In order for a COM object to be created, two associated items must exist:
  • A Class ID.
  • A Class Factory.


Each COM Class or CoClass must be associated with a unique Class ID (a GUID). It must also be associated with its own Class Factory (that is achieved by using a centralized registry). A Class Factory is itself a COM object. It is an object that must expose the IClassFactory or IClassFactory2 (the latter with licensing support) interface. The responsibility of such an object is to create other objects.

A class factory object is usually contained within the same executable code (i.e. the server code) as the COM object itself. When a class factory is called upon to create a target object, this target object's class id must be provided. This is how the class factory knows which class of object to instantiate.

A single class factory object may create objects of more than one class. That is, two objects of different class ids may be created by the same class factory object. However, this is transparent to the COM system.

By delegating the responsibility of object creation into a separate object, a greater level of abstraction is promoted, and the developer is given greater flexibility. For example, implementation of the Singleton and other creation patterns is facilitated. Also, the calling application is shielded from the COM object's memory allocation semantics by the factory object.

In order for client applications to be able to acquire class factory objects, COM servers must properly expose them. A class factory is exposed differently, depending on the nature of the server code. A server which is DLL-based must export a DllGetClassObject global function. A server which is EXE-based registers the class factory at runtime via the CoRegisterClassObject Windows API function.

The following is a general outline of the sequence of object creation via its class factory:
  1. The object's class factory is obtained via the CoGetClassObject API (a standard Windows API).
    As part of the call to CoGetClassObject, the Class ID of the object (to be created) must be supplied. The following C++ code demonstrates this:
     IClassFactory* pIClassFactory = NULL;

    CoGetClassObject(CLSID_SomeObject, CLSCTX_ALL, NULL, IID_IClassFactory, (LPVOID*)&pIClassFactory);
    The above code indicates that the Class Factory object of a COM object, which is identified by the class id CLSID_SomeObject, is required. This class factory object is returned by way of its IClassFactory interface.
  2. The returned class factory object is then requested to create an instance of the originally intended COM object. The following C++ code demonstrates this:
     ISomeObject* pISomeObject = NULL;

    if (pIClassFactory)
    The above code indicates the use of the Class Factory object's CreateInstance method to create an object which exposes an interface identified by the IID_ISomeObject GUID. A pointer to the ISomeObject interface of this object is returned. Also note that because the class factory object is itself a COM object, it needs to be released when it is no longer required (i.e. its Release method must be called).
The above demonstrates, at the most basic level, the use of a class factory to instantiate an object. Higher level constructs are also available, some of which do not even involve direct use of the Windows APIs.

For example, the CoCreateInstance API can be used by an application to directly create a COM object without acquiring the object's class factory. However, internally, the CoCreateInstance API itself will invoke the CoGetClassObject API to obtain the object's class factory and then use the class factory's CreateInstance method to create the COM object.

VBScript supplies the New keyword as well as the CreateObject global function for object instantiation. These language constructs encapsulate the acquisition of the class factory object of the target object (via the CoGetClassObject API) followed by the invocation of the IClassFactoryCreateInstance method.

Other languages, e.g. PowerBuilder's PowerScript may also provide their own high-level object creation constructs. However, CoGetClassObject and the IClassFactory interface remain the most fundamental object creation technique.

Reflection

At the time of the inception of COM technologies, the only way for a client to find out what features an object would offer, was to actually create one instance and call into its QueryInterface method (part of the required IUnknown interface).

This way of exploration became awkward for many applications, including the selection of appropriate components for a certain task, and tools to help a developer understand how to use methods provided by an object.

As a result, COM Type Libraries were introduced, through which components can describe themselves. A type library contains information such as the CLSID of a component, the IIDs of the interfaces the component implements, and descriptions of each of the methods of those interfaces. Type libraries are typically used by Rapid Application Development
Rapid application development

Rapid application development is a software development methodology, which involves iterative development and the construction of prototypes....
 (RAD) environments such as Visual Basic
Visual Basic

'Visual Basic' is the third-generation programming language event-driven programming and integrated integrated development environment from Microsoft for its Component Object Model programming model....
 or Visual Studio to assist developers of client applications.

Programming

COM is a binary standard (also said to be language agnostic) and may be developed in any programming language capable of understanding and implementing its binary defined data types and interfaces.

Runtime libraries (in extreme situations, the programmers) are responsible for entering and leaving the COM environment, instantiating and reference counting COM objects, querying objects for version information, coding to take advantage of advanced object versions, and coding graceful degradation of function when newer versions aren't available.

Application and network transparency

COM objects may be instantiated and referenced from within a process, across process boundaries within a computer, and across a network, using the DCOM technology. Out-of-process and remote objects may use marshalling
Serialization

In computer science, in the context of data storage and transmission, serialization is the process of converting an object into a sequence of bits so that it can be stored on a storage medium or transmitted across a computer network connection link....
 to send method calls and return values back and forth. The marshalling is invisible to the object and the code using the object.

Threading in COM

In COM, threading issues are addressed by a concept known as "apartment models". Here the term "apartment" refers to an execution context wherein a single thread or a group of threads is associated with one or more COM objects.

Apartments stipulate the following general guidelines for participating threads and objects:
  • Each COM object is associated with one and only one apartment. This is decided at the time the object is created at runtime. After this initial setup, the object remains in that apartment throughout its lifetime.
  • A COM thread (i.e., a thread in which COM objects are created or COM method calls are made) is also associated with an apartment. Like COM objects, the apartment with which a thread is associated is also decided at initialization time. Each COM thread also remains in its designated apartment until it terminates.
  • Threads and objects which belong to the same apartment are said to follow the same thread access rules. Method calls which are made inside the same apartment are performed directly without any assistance from COM.
  • Threads and objects from different apartments are said to play by different thread access rules. Method calls made across apartments are achieved via marshalling. This requires the use of proxies and stubs.


There are three types of Apartment Models in the COM world: Single-Threaded Apartment (STA), Multi-Threaded Apartment (MTA), and Neutral Apartment. Each apartment represents one mechanism whereby an object's internal state may be synchronized across multiple threads.

The Single-Threaded Apartment (STA) model is a very commonly used model. Here, a COM object stands in a position similar to a desktop application's user interface. In an STA model, a single thread is dedicated to drive an object's methods, i.e. a single thread is always used to execute the methods of the object. In such an arrangement, method calls from threads outside of the apartment are marshalled
Serialization

In computer science, in the context of data storage and transmission, serialization is the process of converting an object into a sequence of bits so that it can be stored on a storage medium or transmitted across a computer network connection link....
 and automatically queued by the system (via a standard Windows message queue). Thus, there is no worry about race conditions or lack of synchronicity because each method call of an object is always executed to completion before another is invoked.

If the COM object's methods perform their own synchronization, multiple threads dedicated to calling methods on the COM object are permitted. This is termed the Multiple Threaded Apartment (MTA). Calls to an MTA object from a thread in an STA are also marshaled. A process can consist of multiple COM objects, some of which may use STA and others of which may use MTA. The Thread Neutral Apartment allows different threads, none of which is necessarily dedicated to calling methods on the object, to make such calls. The only provision is that all methods on the object must be serially reentrant.

Criticisms

Since COM has a fairly complex implementation, programmers can be distracted by some of the "plumbing" issues.

Message pumping


When an STA is initialized it creates a hidden window that is used for inter-apartment and inter-process message routing. This window must have its message queue regularly pumped. This construct is known as a message pump. On earlier versions of Windows, failure to do so could cause system-wide deadlocks. This problem is especially nasty because some Windows APIs initialize COM as part of their implementation, which causes a leak of implementation details.

Reference counting

Reference counting within COM may cause problems if two or more objects are circularly referenced
Circular reference

A circular reference, sometimes referred to as a run-around, is a series of references where the last object references the first, thus causing the whole series of references to be unusable....
. The design of an application must take this into account so that objects are not left orphaned.

Objects may also be left with active reference counts if the COM "event sink" model is used. Since the object that fires the event needs a reference to the object reacting to the event, the object's reference count will never reach zero.

Reference cycles are typically broken using either out-of-band termination or split identities. In the out of band termination technique, an object exposes a method which, when called, forces it to drop its references to other objects, thereby breaking the cycle. In the split identity technique, a single implementation exposes two separate COM objects (also known as identities). This creates a weak reference
Weak reference

In computer programming, a weak reference is a Reference that does not protect the referent object from collection by a garbage collection . An object referenced only by weak references is considered Unreachable memory and so may be collected at any time....
 between the COM objects, preventing a reference cycle.

DLL hell

Because the location of each component is stored in a system-wide location (the Windows registry
Windows registry

The Windows Registry is a directory which stores settings and options for Microsoft Windows operating systems. It contains information and settings for all the hardware, operating system software, most non-operating system software, and per-user settings....
), there can be only one version of a certain component installed. This limitation can seriously complicate the deployment of COM-based applications, due to the possibility that different programs, or different versions of the same program, might require two or more different versions of the same COM component. This condition is known as DLL hell
DLL hell

In computing, DLL hell is a colloquial term for the complications that arise when working with dynamic link library used with Microsoft Windows operating systems, particularly legacy 16-bit editions....
. While this condition has been known to occur with OS components, it is generally a condition created by application developers in the use of their own components. The problem can be reduced or eliminated completely by careful software versioning and regression testing
Regression testing

Regression testing is any type of software testing which seeks to uncover Software regression. Such regressions occur whenever software functionality that was previously working correctly stops working as intended....
.

Windows XP
Windows XP

Windows XP is a line of operating systems produced by Microsoft for use on personal computers, including home and business desktops, laptop, and media centers....
 introduced a new mode of COM object registration called "Registration-free COM". This facility makes it possible for applications that need to install COM objects to store all the required COM registry information in the application's directory, instead of in the global registry, where, strictly speaking only a single application will ever use it. DLL hell can be substantially avoided using Registration-free COM, the only limitation being it requires at least Windows XP
Windows XP

Windows XP is a line of operating systems produced by Microsoft for use on personal computers, including home and business desktops, laptop, and media centers....
 or later Windows versions and that it must not be used for EXE COM servers or system-wide components such as MDAC, MSXML
MSXML

Microsoft XML Core Services is a set of services that allow applications written in JScript, VBScript, and Microsoft development tools to build Windows-native XML-based applications....
, DirectX
DirectX

Microsoft DirectX is a collection of application programming interfaces for handling tasks related to multimedia, especially game programming and video, on Microsoft platforms....
 or Internet Explorer
Internet Explorer

Windows Internet Explorer , commonly abbreviated to IE, is a series of graphical user interface web browsers developed by Microsoft and included as part of the Microsoft Windows line of operating systems starting in 1995....
.

RegFree COM

RegFree COM (or Registration-Free COM) is a technology introduced with Windows XP
Windows XP

Windows XP is a line of operating systems produced by Microsoft for use on personal computers, including home and business desktops, laptop, and media centers....
 that allows Component Object Model
Component Object Model

Component Object Model is an interface standard for software componentry introduced by Microsoft in 1993. It is used to enable interprocess communication and dynamic object creation in a large range of programming languages....
 (COM) components without using the registry
Windows registry

The Windows Registry is a directory which stores settings and options for Microsoft Windows operating systems. It contains information and settings for all the hardware, operating system software, most non-operating system software, and per-user settings....
 to store activation metadata
Metadata

Metadata is "data about other data", of any sort in any media. An item of metadata may describe an individual datum, or content item, or a collection of data including multiple content items and hierarchical levels, for example a database schema....
 and CLSID (Class ID) for the component. Instead, the metadata and CLSIDs of the classes implemented in the component are stored in a separate .manifest
Manifest (computing)

Manifest is a file that contains metadata describing other Application software or software componentrys....
file (described using XML) in the same directory as the component. This allows multiple versions of the same component to be installed in different directories, described by their own manifests, as well as XCOPY deployment
XCOPY deployment

XCOPY deployment is a term used to describe a software application's ability to be installed into a Microsoft Windows system simply by copying files....
.

During application loading, the COM runtime looks for the presence of the manifest file. If it is present, the COM runtime creates an in-memory table relating the CLSIDs and the component that provides an implementation of the class. When a COM class is instantiated, the in-memory table is first checked if the corresponding implementation for the CLSID can be found. Only if the lookup fails is the registry
Windows registry

The Windows Registry is a directory which stores settings and options for Microsoft Windows operating systems. It contains information and settings for all the hardware, operating system software, most non-operating system software, and per-user settings....
 scanned.

See also

  • CORBA
    Çorba

    Chorba , shurpa , sorpa , or shorpo is one of various kinds of soup or stew found in national cuisines across Eurasia. The term is likely of Persian language or Turkic languages origin....
     (Common Object Request Broker Architecture - Version 1 - 1991)
  • GNOME
    Gnome

    A gnome is a mythical creature characterized by its extremely small size and wiktionary:subterranean lifestyle. The word gnome is derived from the New Latin gnomus....
     Bonobo
    Bonobo (computing)

    Bonobo is a software componentry for creating reusable software components and compound documents. It was created formerly by Ximian for compound documents used in GNOME....
  • KDE
    KDE

    KDE is a free software project based around its flagship product, a desktop environment for Unix-like systems. The goal of the project is to provide basic desktop functions and applications for daily needs as well as tools and documentation for developers to write stand-alone applications for the system....
     KPart
    KPart

    In computer programming, KParts is the name of the software component framework for the KDE desktop environment. An individual component is called a KPart....


External links

  • (Video Webcast, August 2006)
  • by Kraig Brockschmidt. An Overview of COM and OLE.
  • from Microsoft
  • with open source dumper utility.