Footnotes

1. The "Microsoft Object Mapping" is an open specification describing the detailed layout of C++ objects. It is supported by the MS C/C++ compiler, as well as C++ compilers from other vendors including Borland™, Symantec™, Watcom™, and others. This is also the location of the this pointer as placed by CFront when using the traditional right-to-left __cdecl calling sequence. Thus, we achieve a large degree of interoperability. [Back]

2. Usually this data follows the pVtbl pointer, but this is not required. It is perfectly legal for object-specific data to precede the vtbl pointer, and this in fact will be common with many C++ compilers. [Back]

3. And, indeed, this syntax will at times be somewhat abused. [Back]

4. Of course, if a client timed the call it might be able to discern a performance penalty if it had both in-process and out-of-process objects to compare. [Back]

5. Though be aware that the use of the term GUID on page 587 is regrettably not the same as its usage in this specification. In this specification, the term GUID is used to refer to all identifiers that are "interoperable" with UUIDs as defined on p586; p587 uses the term to refer to one specific central-authority allocation scheme. Apologies to those who may be confused by this state of affairs. [Back]

6. Throughout this document IDL notation is used to precisely describe interfaces and other types. The actual IDL files contain additional IDL specifies that are used by the IDL compiler to optimize the generation of marshaling code, but have no bearing on the actual interface contract. [Back]

7. That is, a QueryInterface invocation where iid is 00000000-0000-0000-C000-000000000046. [Back]

8. While this set of rules may seem surprising to some, they are needed in order that remote access to interface pointers can be provided with a reasonable degree of efficiency (without this, interface pointers could not be cached on a remote computer). Further, as QueryInterface forms the fundamental architectural basis by which clients reason about the capabilities of an object with which they have come in contact, stability is needed to make any sort of reasonable reasoning and capability discovery possible. [Back]

9. There are in fact more general cases than illustrated here involving n-way rather than 2-way interactions of matched AddRef / Release pairs, but that will not be elaborated on here. [Back]

10. The connection point interfaces introduced in the OLE Controls specification are a real world example of this concept. [Back]

11. "This" is the appropriate thing to AddRef in an object implementation using the approach of multiply inheriting from the suite of interfaces supported by the object; more complex implementation strategies will need to modify this appropriately. [Back]

12. The name "HRESULT" is retained for historical reasons. Readers familiar with programming COM on the Windows platform will note that HRESULT is analogous to SCODE. [Back]

13. As of this writing, said body is Microsoft Corporation. [Back]

14. As of this writing, said body is Microsoft Corporation. [Back]

15. "elt" by itself in the function prototypes is just "element." [Back]

16. Think of "rgelt" as short for "range of elt," signifying an array. [Back]

17. Do not use this CLSID for your own purposes–it is simply an example. See the section "Identifying and Registering the Object" below. [Back]

18. In other words, the client may initialize the object by telling it to read text from a file or by handing text to it through IDataObject::SetData. Either way, the object now has some text to render graphically or to save to a file. [Back]