5.13 COM (Common Object Model)

The ffi/com and ffi/unsafe/com libraries support COM interaction in two layers. The safe upper layer provides functions for creating COM objects and dynamically constructing method calls based on COM automation (i.e., reflective information provided by the object). The unsafe lower layer provides a syntactic form and functions for working more directly with COM objects and interfaces.

A COM object instantiates a particular COM class. A COM class can be specified in either of two ways:

A COM object can be instantiated either on the local machine or on a remote machine. The latter relies on the operating system’s DCOM (distributed COM) support.

Each COM object supports some number of COM interfaces. A COM interface has a programmatic name, such as IDispatch, that corresponds to a C-layer protocol. Each interface also has an IID (interface id) that is represented as a GUID such as "{00020400-0000-0000-C000-000000000046}". Direct calls to COM methods require extracting a suitable interface pointer from an object using QueryInterface and the desired IID; the result is effectively cast it to a pointer to a dispatch-table pointer, where the dispatch table has a statically known size and foreign-function content. The define-com-interface form simplifies description and use of interface pointers. The COM automation layer uses a fixed number of reflection interfaces internally, notably IDispatch, to call methods by name and with safe argument marshaling.

    5.13.1 COM Automation

      5.13.1.1 GUIDs, CLSIDs, IIDs, and ProgIDs

      5.13.1.2 COM Objects

      5.13.1.3 COM Methods

      5.13.1.4 COM Properties

      5.13.1.5 COM Events

      5.13.1.6 COM Enumerations

      5.13.1.7 Interface Pointers

      5.13.1.8 Remote COM servers (DCOM)

      5.13.1.9 COM Types

      5.13.1.10 Class Display Names

    5.13.2 COM Classes and Interfaces

      5.13.2.1 Describing COM Interfaces

      5.13.2.2 Obtaining COM Interface References

      5.13.2.3 COM FFI Helpers

      5.13.2.4 COM Interface Example

    5.13.3 ActiveX Controls