Annotation of mstools/mfc/doc/tn008.txt, revision 1.1.1.1

1.1       root        1: Microsoft Foundation Classes                           Microsoft Corporation
                      2: Technical Notes 
                      3: 
                      4: #8 : General OLE Overview
                      5: 
                      6: This note gives a general overview of OLE, and the OLE support provided
                      7: by the MFC library.
                      8: 
                      9: The first section is an extract from the OLE API documentation.
                     10: The second section describes how the MFC OLE classes provide an
                     11: interface to the system level OLE libraries.
                     12: 
                     13: =============================================================================
                     14: General OLE Overview
                     15: ====================
                     16: 
                     17: Compound Documents 
                     18: ------------------
                     19: 
                     20: An application that uses OLE can cooperate with other OLE applications to
                     21: produce a document containing different kinds of data, all of which can be
                     22: easily manipulated by the user. The user editing such a document is able to
                     23: improve the document by using the best features of many different
                     24: applications. An application that implements OLE allows its users
                     25: to move away from an application-centered view of computing and toward a
                     26: document-centered view.
                     27: 
                     28: A document that supports OLE objects can contain many kinds of
                     29: data in many different formats; such a document is called a compound
                     30: document. A compound document uses the facilities of different OLE
                     31: applications to manipulate the different kinds of data it displays. Any kind
                     32: of data format can be incorporated into a compound document; with little or
                     33: no extra code.  The user working with a compound document does not need
                     34: to know which data formats are compatible with one another or how to find
                     35: and start any applications that created the data. Whenever a user chooses to
                     36: work with part of a compound document, the application responsible for that
                     37: part of the document starts automatically.
                     38: 
                     39: Linked and Embedded Objects
                     40: ---------------------------
                     41: 
                     42: An object is any data that can be presented in a compound document and
                     43: manipulated by a user. Anything from a single cell in a spreadsheet to an
                     44: entire document can be an object. When an object is incorporated into a
                     45: document, it maintains an association with the application that produced it.
                     46: 
                     47: For example, if a range of spreadsheet cells were an embedded object in a
                     48: text file, all the data associated with the cells would be saved as part of
                     49: the text file, including any necessary formulas.
                     50: The name of the server for the spreadsheet cells would be saved along with
                     51: this data. The user could select this embedded object while working with the
                     52: text file, and the spreadsheet application would be started automatically
                     53: for editing those cells.
                     54: If the range of cells were a linked object instead of an embedded object,
                     55: the data would be stored in some other file and only a link to the data
                     56: would be saved with the text file. The presentation of the data and the
                     57: behavior of the cells would be the same as for an embedded object.
                     58: 
                     59: Verbs
                     60: -----
                     61: 
                     62: The types of actions a user can perform on an object are called verbs. Two
                     63: typical verbs for an object are 'Play' and 'Edit'.
                     64: 
                     65: The nature of an object determines its behavior when a user works with it.
                     66: The most typical use for some objects, such as voice annotations and
                     67: animated scripts, is to play them. For example, a user could play an
                     68: animated script by double clicking it. In this case, 'Play' is the primary
                     69: verb for the object.
                     70: 
                     71: For other objects, the most typical use is to edit them. In the case of text
                     72: produced by a word processor, for example, the primary verb could be 'Edit'.
                     73: 
                     74: The client application typically specifies the primary verb when the user
                     75: double-clicks an object. However, the server application determines the
                     76: meaning of that verb. A user can invoke an object's subsidiary verbs by
                     77: using the class name Object menu item or the Links dialog box.
                     78: 
                     79: Many objects support only one verb - for example, an object created by a
                     80: text editor might support only 'Edit'. If an object supports only one verb,
                     81: that verb is used no matter what the client application specifies.
                     82: 
                     83: Benefits of Object Linking and Embedding
                     84: ----------------------------------------
                     85: 
                     86: OLE offers the following benefits:
                     87: 
                     88:   An application can specialize in performing one job very well. For
                     89:    example, a drawing application that implements OLE would not necessarily
                     90:    need any text-editing tools; a user could put text into the drawing and
                     91:    edit that text by using any text editor that supports OLE.
                     92: 
                     93:   An application automatically extensible for future data formats, because
                     94:    the content of an object does not matter to the containing document.
                     95: 
                     96:   A user can concentrate on the task instead of on any applications
                     97:    required to complete the task.
                     98: 
                     99:   A File can be more compact, because linking to objects allows a file to
                    100:    use an object without having to store that object's data.
                    101: 
                    102:   A document can be printed or transmitted without using the application
                    103:    that originally produced the document.
                    104: 
                    105:   Linked objects in a file can be updated dynamically.
                    106: 
                    107: -----------------------------------------------------------------------------
                    108: Data Transfer in OLE
                    109: ---------------------
                    110: 
                    111: This section gives a brief overview of how applications share information
                    112: under OLE.
                    113: 
                    114: Client Applications
                    115: -------------------
                    116: 
                    117: An OLE client application can accept, display, and store OLE objects. The
                    118: objects themselves can contain any kind of data. A client application
                    119: typically identifies an object with a distinctive border or other visual
                    120: cue.
                    121: 
                    122: Server Applications
                    123: -------------------
                    124: 
                    125: An OLE server is any application that can edit or otherwise manipulate an
                    126: object in response to a request from a client application.
                    127: When the user double-clicks an object in a client application, the
                    128: server associated with that object starts and the user works with the object
                    129: inside the server application. When the server starts, its window is
                    130: typically sized so that only the object is visible. If the user
                    131: double-clicks a linked object, the entire linked file is loaded, and the
                    132: linked portion of the file is selected. For embedded objects, the user
                    133: chooses the Update command from the File menu to save changes to the object
                    134: and chooses Exit when finished.
                    135: 
                    136: Many applications are capable of acting as both clients and servers for
                    137: OLE objects.
                    138: 
                    139: Clipboard Conventions
                    140: ---------------------
                    141: 
                    142: When first embedding or linking an object, OLE client and server
                    143: applications typically exchange data by using the clipboard. When a server
                    144: application puts an object on the clipboard, it represents the object with
                    145: data formats, such as Native data, OwnerLink data, ObjectLink data, and a
                    146: presentation format. The order in which these formats are put on the
                    147: clipboard is very important, because the order determines the type of
                    148: object. For example, if the first format is Native and the second is
                    149: OwnerLink, client applications can use the data to create an embedded
                    150: object. If the first format is ObjectLink, however, the data describes a
                    151: linked object.
                    152: 
                    153: Native data completely defines an object for a particular server. The data
                    154: can be meaningful only to the server application. The client application
                    155: provides storage for Native data, in the case of embedded objects.
                    156: 
                    157: Presentation formats allow the client library to display the object in a
                    158: document. CF_METAFILEPICT, CF_DIB, and CF_BITMAP are typical presentation
                    159: formats.
                    160: 
                    161: MFC OLE supports Native and CF_METAFILEPICT data formats.  Additional
                    162: formats can be added.
                    163: 
                    164: Registration
                    165: ------------
                    166: 
                    167: The system registration database supports OLE by providing a system-wide
                    168: source of information about whether server applications support the OLE
                    169: protocol, the names of the executable files for these applications,
                    170: the verbs for classes of objects, and whether an object-handler library
                    171: exists for a given class of object.
                    172: 
                    173: When a server application is installed, it registers itself as an OLE
                    174: server with the system registration database. (This database is
                    175: supported by the dynamic-link library SHELL.DLL.) To register itself
                    176: as an OLE server, a setup program, or the AfxOleRegisterServerName()
                    177: function records in the database information detailing what OLE
                    178: protocols are supported.
                    179: 
                    180: For example, the MFC sample ole server MINSVR in
                    181: \C700\MFC\SAMPLES\MINSVR can be registered just by running the
                    182: application in a standalone mode.  Standalone means running the
                    183: application from the main menu, file manager, or by clicking an icon.
                    184: 
                    185: If the location of the server changes, then just re-run the server
                    186: application to change the database information.  However, if you are
                    187: currently running a client program (i.e. TestClnt, OClient, Word For
                    188: Windows, etc.) while re-registering the server, the client must be
                    189: shut down and restarted to recieve the updated location.
                    190: 
                    191: When a client activates a linked or embedded object, the client library
                    192: finds the command line for the server in the database, appends the
                    193: "/Embedding" or "/Embedding <filename>" command-line option, and uses the new
                    194: command line to start the server. (Starting the server with either of these
                    195: options differs from the user starting it directly. Either a slash (/) or a
                    196: hyphen (-) can precede the word "Embedding.)
                    197: 
                    198: Registration Database
                    199: ---------------------
                    200: 
                    201: Applications typically add key/value pairs to the registration database by
                    202: using the Microsoft Windows Registration Editor. (For more information about
                    203: this application, see Microsoft Windows Programming Tools.) Applications
                    204: could also use the registration functions to add this information to the
                    205: database.
                    206: 
                    207: To be available for OLE transactions, a server should register the key/value
                    208: pairs as illustrated below: (see TN010.TXT for more details)
                    209: 
                    210: HKEY_CLASSES_ROOT\.ext = class name
                    211: HKEY_CLASSES_ROOT\class name = readable version of class name
                    212: HKEY_CLASSES_ROOT\class name\protocol\StdFileEditing\server =
                    213:         executable file name
                    214: HKEY_CLASSES_ROOT\class name\protocol\StdFileEditing\handler =
                    215:         dll name
                    216: HKEY_CLASSES_ROOT\class name\protocol\StdFileEditing\verb\0 =
                    217:         primary verb
                    218: HKEY_CLASSES_ROOT\class name\protocol\StdFileEditing\verb\1 =
                    219:         secondary verb
                    220: 
                    221: For compatibility with earlier applications, the system registration service
                    222: also reads and writes registration information in the [embedding] section of
                    223: the WIN.INI initialization file.
                    224: 
                    225: The protocol "StdFileEditing" is currently the only OLE protocol used
                    226: for linking and embedding.
                    227: 
                    228: =============================================================================
                    229: =============================================================================
                    230: MFC and OLE
                    231: ===========
                    232: 
                    233: Applications use three dynamic-libraries, OLECLI.DLL, OLESVR.DLL, and
                    234: SHELL.DLL, to implement object linking and embedding. Object linking and
                    235: embedding is supported by OLECLI.DLL and OLESVR.DLL. The system registration
                    236: database is supported by SHELL.DLL.
                    237: 
                    238: The MFC library support for OLE makes some simplifying assumptions to make
                    239: the common OLE services easier to implement.
                    240: 
                    241: For those familiar with the existing C based OLE API, please read the next
                    242: section which describes the differences between MFC OLE and the system
                    243: OLE interface.
                    244: 
                    245: 
                    246: MFC OLE v.s. OLE API
                    247: --------------------
                    248: Here are the basic differences between MFC OLE and the system OLE API.
                    249: 
                    250: Language:
                    251:         MFC OLE:        C++
                    252:         OLE API:        C
                    253: 
                    254: Library Interface:
                    255:         MFC OLE:        C++ classes
                    256:         OLE API:        Handles, and manually built jump tables (_VTBLs)
                    257: 
                    258: Server requests:
                    259:         MFC OLE:        Synchronous
                    260:         OLE API:        Mostly synchronous, but may be asynchronous
                    261:         (i.e. MFC OLE automatically handles OLE_WAIT_FOR_RELEASE)
                    262: 
                    263: Special case handling for errors, retry:
                    264:         MFC OLE:        Provided by library
                    265:         OLE API:        Your program must do it all
                    266: 
                    267: Return codes:
                    268:         MFC OLE:        As with standard MFC/Windows API, return useful 
                    269:                           values, with Exceptions thrown if appropriate.
                    270:         OLE API:        Return OLESTATUS all the time.
                    271: 
                    272: User Interface Support:
                    273:         MFC OLE:        Support for "Insert New Object" dialog, "Links"
                    274:                         dialog and support for the "Object" menu item
                    275:                         attached to the "Edit" menu.
                    276:         OLE API:        none.
                    277: 
                    278: Other notes:
                    279:     * MFC OLE does not currently support "Object Handlers" (i.e. DLLs that
                    280:         are more efficient than launching a server application)
                    281:     * MFC OLE assumes there is one OLECLIENT for each OLEOBJECT (this is
                    282:         part of the OLE API design, but wasn't reflected in old source
                    283:         code examples).
                    284:     * Users of MFC OLE do not need to build manual VTBLs or call
                    285:         MakeProcInstance as described by the OLE API (the MFC libraries
                    286:         do all that low level binding for you).
                    287:     * MFC OLE does not currently support the "Paste Special" dialog.
                    288: 
                    289:     * MFC OLE does not provide C++ interfaces to all of the OLE API
                    290:         functions, just the most useful ones.
                    291:     * MFC OLE is built on top of the OLE API and DLLs. It is easy to
                    292:         call additional OLE APIs or use the underlying OLE API if needed.
                    293:     * Since MFC OLE is built on top of the OLE API, the underlying transport
                    294:         mechanism is the same as all other OLE Apps (i.e. DDE is still
                    295:         the communication standard).  MFC OLE apps work with any other
                    296:         OLE apps.
                    297: 
                    298: -----------------------------------------------------------------------------
                    299: MFC OLE Classes
                    300: ---------------
                    301: 
                    302: MFC OLE splits the OLE API functionality into two disjoint sets of classes,
                    303: one set for client programs, the other set for server programs.
                    304: If a program wants to be both a client and a server, it will use all
                    305: the OLE classes.  The interface to all MFC OLE classes are contained
                    306: in the one C++ header file "afxole.h" that includes the standard OLE API
                    307: C header file "ole.h".
                    308: 
                    309: Terminology note: MFC OLE uses the term "item" to indicate an OLE object
                    310: that supports the "StdFileEditing" protocol (to avoid confusion with
                    311: the C++ and MFC term "object").
                    312: 
                    313: General classes:
                    314:     COleException is a general exception class used by both
                    315:         Clients and Servers.  See MFC overview and class
                    316:         reference documentation for more information on exceptions.
                    317: 
                    318: The Client classes include:
                    319:     COleClientDoc is a client document that manages client items
                    320:     COleClientItem is the client-side connection to an embedded or
                    321:         linked OLE item.
                    322: 
                    323: The Server classes include:
                    324:     COleServer is a server application that creates and manages server
                    325:         documents.
                    326:     COleServerDoc is a server document that creates and manages server items
                    327:     COleServerItem is the server-side of an embedded or linked OLE item.
                    328: 
                    329: Notes:
                    330:     * All MFC OLE classes start with 'COle'.
                    331:     * With the exception of COleException, you must derive your own classes
                    332:     from each of these COle classes in order to build a working application.
                    333: 
                    334: See TN009.TXT for what you must do to build a client app.
                    335: See TN010.TXT for what you must do to build a server app.
                    336: 
                    337: -----------------------------------------------------------------------------
                    338: 
                    339: A class hierarchy diagram of the MFC OLE classes shows the relationship
                    340:     between the library classes any your derived classes:
                    341: 
                    342:     CObject
                    343:        COleClientDoc
                    344:            << your client doc >>
                    345:        COleClientItem
                    346:             << your client item >>
                    347:        COleServer
                    348:             << your server app >>
                    349:        COleServerDoc
                    350:             << your server doc >>
                    351:        COleServerItem
                    352:             << your server item >>
                    353:        CException
                    354:             COleException
                    355: 
                    356: 
                    357: A more interesting diagram shows the relationships between MFC OLE objects:
                    358: 
                    359:         CLIENT APPLICATION            SERVER APPLICATION
                    360: 
                    361:     client application                           COleServer
                    362:         \                                        /
                    363:         COleClientDoc                         COleServerDoc
                    364:            \                                /
                    365:             COleClientItem    < ----- > COleServerItem
                    366: 
                    367:     To recap:
                    368:         * a client application can have zero or more COleClientDocs
                    369:         * each COleClientDoc can have zero or more COleClientItems
                    370:         * a COleServer can have zero or more COleServerDocs
                    371:         * each COleServerDoc can have zero or more COleServerItems
                    372: 
                    373: -----------------------------------------------------------------------------
                    374: Notes on using the MFC OLE Classes
                    375: ----------------------------------
                    376: Important Note: The connection between 'COleClientItem' and
                    377: 'COleServerItem' in the above diagram is for illustrative purposes only.
                    378: The actual connection is through a DDE link which is established and
                    379: managed by the OLE DLLs.  A client application should never directly
                    380: call a member function of a OLE Server class (COleServer, COleServerDoc
                    381: or COleServerItem).  Similarly a server application should never
                    382: directly call a member function of an OLE client class (COleClientDoc
                    383: or COleClientItem).
                    384: 
                    385: Many of the member functions in the MFC OLE classes are 'protected',
                    386: and some are even pure virtual.
                    387: You are responsible for implementing these overridable callbacks even
                    388: though you will rarely if ever call them directly.
                    389: 
                    390: =============================================================================

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.