|
|
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: =============================================================================
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.