1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
|
/*************************************************************************
**
** OLE 2.0 Sample Code
**
** oleoutl.h
**
** This file contains file contains data structure defintions,
** function prototypes, constants, etc. which are common to the
** server version and the container version of the app.
** app version of the Outline series of sample applications:
** Outline -- base version of the app (without OLE functionality)
** SvrOutl -- OLE 2.0 Server sample app
** CntrOutl -- OLE 2.0 Containter sample app
**
** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
**
*************************************************************************/
#if !defined( _OLEOUTL_H_ )
#define _OLEOUTL_H_
#ifndef RC_INVOKED
#pragma message ("INCLUDING OLEOUTL.H from " __FILE__)
// make 'different levels of inderection' considered an error
#pragma warning (error:4047)
#endif /* RC_INVOKED */
#if defined( USE_MSGFILTER )
#include "msgfiltr.h"
#endif // USE_MSGFILTER
#include "defguid.h"
/* Defines */
/* OLE2NOTE: these strings should correspond to the strings registered
** in the registration database.
*/
// REVIEW: should load strings from resource file
#if defined( INPLACE_SVR )
#define CLSID_APP CLSID_ISvrOtl
#define FULLUSERTYPENAME "Ole 2.0 In-Place Server Outline"
#define SHORTUSERTYPENAME "Outline" // max 15 chars
#undef APPFILENAMEFILTER
#define APPFILENAMEFILTER "Outline Files (*.OLN)|*.oln|All files (*.*)|*.*|"
#undef DEFEXTENSION
#define DEFEXTENSION "oln" // Default file extension
#endif // INPLACE_SVR
#if defined( INPLACE_CNTR )
#define CLSID_APP CLSID_ICntrOtl
#define FULLUSERTYPENAME "Ole 2.0 In-Place Container Outline"
// #define SHORTUSERTYPENAME "Outline" // max 15 chars
#undef APPFILENAMEFILTER
#define APPFILENAMEFILTER "CntrOutl Files (*.OLC)|*.olc|Outline Files (*.OLN)|*.oln|All files (*.*)|*.*|"
#undef DEFEXTENSION
#define DEFEXTENSION "olc" // Default file extension
#endif // INPLACE_CNTR
#if defined( OLE_SERVER ) && !defined( INPLACE_SVR )
#define CLSID_APP CLSID_SvrOutl
#define FULLUSERTYPENAME "Ole 2.0 Server Sample Outline"
#define SHORTUSERTYPENAME "Outline"
#undef APPFILENAMEFILTER
#define APPFILENAMEFILTER "Outline Files (*.OLN)|*.oln|All files (*.*)|*.*|"
#undef DEFEXTENSION
#define DEFEXTENSION "oln" // Default file extension
#endif // OLE_SERVER && ! INPLACE_SVR
#if defined( OLE_CNTR ) && !defined( INPLACE_CNTR )
#define CLSID_APP CLSID_CntrOutl
#define FULLUSERTYPENAME "Ole 2.0 Container Sample Outline"
// #define SHORTUSERTYPENAME "Outline" // max 15 chars
#undef APPFILENAMEFILTER
#define APPFILENAMEFILTER "CntrOutl Files (*.OLC)|*.olc|Outline Files (*.OLN)|*.oln|All files (*.*)|*.*|"
#undef DEFEXTENSION
#define DEFEXTENSION "olc" // Default file extension
#endif // OLE_CNTR && ! INPLACE_CNTR
// Maximum number of formats offered by IDataObject::GetData/SetData
#define MAXNOFMTS 10
#define MAXNOLINKTYPES 3
#if defined( USE_DRAGDROP )
#define DD_SEL_THRESH HITTESTDELTA // Border threshold to start drag
#define MAX_SEL_ITEMS 0x0080
#endif // USE_DRAGDROP
/* Positions of the various menus */
#define POS_FILEMENU 0
#define POS_EDITMENU 1
#define POS_VIEWMENU 2
#define POS_LINEMENU 3
#define POS_NAMEMENU 4
#define POS_OPTIONSMENU 5
#define POS_DEBUGMENU 6
#define POS_HELPMENU 7
#define POS_OBJECT 11
/* Types */
// Document initialization type
#define DOCTYPE_EMBEDDED 3 // init from an IStorage* of an embedded obj
#define DOCTYPE_FROMSTG 4 // init from an IStorage* with doc bit set
/* Forward type definitions */
typedef struct tagOLEAPP FAR* LPOLEAPP;
typedef struct tagOLEDOC FAR* LPOLEDOC;
/* Flags to control Moniker assignment for OleDoc_GetFullMoniker */
// REVIEW: should use official OLEGETMONIKER type for final version
typedef enum tagGETMONIKERTYPE {
GETMONIKER_ONLYIFTHERE = 1,
GETMONIKER_FORCEASSIGN = 2,
GETMONIKER_UNASSIGN = 3,
GETMONIKER_TEMPFORUSER = 4
} GETMONIKERTYPE;
/* Flags to control direction for drag scrolling */
typedef enum tagSCROLLDIR {
SCROLLDIR_NULL = 0,
SCROLLDIR_UP = 1,
SCROLLDIR_DOWN = 2,
SCROLLDIR_RIGHT = 3, // currently not used
SCROLLDIR_LEFT = 4 // currently not used
} SCROLLDIR;
/*************************************************************************
** class OLEDOC : OUTLINEDOC
** OLEDOC is an extention to the base OUTLINEDOC object (structure)
** that adds common OLE 2.0 functionality used by both the server
** and container versions. This is an abstract class. You do not
** instantiate an instance of OLEDOC directly but instead
** instantiate one of its concrete subclasses: SERVERDOC or
** CONTAINERDOC. There is one instance of an document
** object created per document open in the app. The SDI
** version of the app supports one ServerDoc at a time. The MDI
** version of the app can manage multiple documents at one time.
** The OLEDOC class inherits all fields from the OUTLINEDOC class.
** This inheritance is achieved by including a member variable of
** type OUTLINEDOC as the first field in the OLEDOC
** structure. Thus a pointer to an OLEDOC object can be cast to be
** a pointer to a OUTLINEDOC object.
*************************************************************************/
typedef struct tagOLEDOC {
OUTLINEDOC m_OutlineDoc; // ServerDoc inherits from OutlineDoc
ULONG m_cRef; // total ref count for document
ULONG m_dwStrongExtConn; // total strong connection count
// (from IExternalConnection)
// when this count transitions to 0
// and fLastUnlockCloses==TRUE, then
// IOleObject::Close is called to
// close the document.
#if defined( _DEBUG )
ULONG m_cCntrLock; // total count of LockContainer locks
// (for debugging purposes only)
#endif
LPSTORAGE m_lpStg; // OleDoc must keep its stg open
// even in-memory server doc should
// keep Stg open for low memory save
LPSTREAM m_lpLLStm; // Hold LineList IStream* open for
// low memory save
LPSTREAM m_lpNTStm; // Hold NameTable IStream* open for
// low memory save
BOOL m_fObjIsClosing; // flag to guard recursive close call
BOOL m_fObjIsDestroying; // flag to guard recursiv destroy call
DWORD m_dwRegROT; // key if doc registered as running
LPMONIKER m_lpFileMoniker; // moniker if file-based/untitled doc
BOOL m_fLinkSourceAvail; // can doc offer CF_LINKSOURCE
LPOLEDOC m_lpSrcDocOfCopy; // src doc if doc created for copy
BOOL m_fUpdateEditMenu; // need to update edit menu??
#if defined( USE_DRAGDROP )
DWORD m_dwTimeEnterScrollArea; // time entering scroll region
DWORD m_dwLastScrollDir; // current dir for drag scroll
DWORD m_dwNextScrollTime; // time for next scroll
BOOL m_fRegDragDrop; // is doc registered as drop target?
BOOL m_fLocalDrag; // is doc source of the drag
BOOL m_fLocalDrop; // was doc target of the drop
BOOL m_fCanDropCopy; // is Drag/Drop copy/move possible?
BOOL m_fCanDropLink; // is Drag/Drop link possible?
BOOL m_fDragLeave; // has drag left
BOOL m_fPendingDrag; // LButtonDown--possible drag pending
POINT m_ptButDown; // LButtonDown coordinates
#endif // USE_DRAGDROP
#if defined( INPLACE_SVR ) || defined( INPLACE_CNTR )
BOOL m_fCSHelpMode; // Shift-F1 context help mode
#endif
struct CDocUnknownImpl {
IUnknownVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_Unknown;
struct CDocPersistFileImpl {
IPersistFileVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_PersistFile;
struct CDocOleItemContainerImpl {
IOleItemContainerVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_OleItemContainer;
struct CDocExternalConnectionImpl {
IExternalConnectionVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_ExternalConnection;
struct CDocDataObjectImpl {
IDataObjectVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_DataObject;
#ifdef USE_DRAGDROP
struct CDocDropSourceImpl {
IDropSourceVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_DropSource;
struct CDocDropTargetImpl {
IDropTargetVtbl FAR* lpVtbl;
LPOLEDOC lpOleDoc;
int cRef; // interface specific ref count.
} m_DropTarget;
#endif // USE_DRAGDROP
} OLEDOC;
/* OleDoc methods (functions) */
BOOL OleDoc_Init(LPOLEDOC lpOleDoc, BOOL fDataTransferDoc);
BOOL OleDoc_InitNewFile(LPOLEDOC lpOleDoc);
void OleDoc_ShowWindow(LPOLEDOC lpOleDoc);
void OleDoc_HideWindow(LPOLEDOC lpOleDoc, BOOL fShutDown);
HRESULT OleDoc_Lock(LPOLEDOC lpOleDoc, BOOL fLock, BOOL fLastUnlockReleases);
ULONG OleDoc_AddRef(LPOLEDOC lpOleDoc);
ULONG OleDoc_Release (LPOLEDOC lpOleDoc);
HRESULT OleDoc_QueryInterface(
LPOLEDOC lpOleDoc,
REFIID riid,
LPVOID FAR* lplpUnk
);
BOOL OleDoc_Close(LPOLEDOC lpOleDoc, DWORD dwSaveOption);
void OleDoc_Destroy(LPOLEDOC lpOleDoc);
void OleDoc_SetUpdateEditMenuFlag(LPOLEDOC lpOleDoc, BOOL fUpdate);
BOOL OleDoc_GetUpdateEditMenuFlag(LPOLEDOC lpOleDoc);
void OleDoc_GetExtent(LPOLEDOC lpOleDoc, LPSIZEL lpsizel);
HGLOBAL OleDoc_GetObjectDescriptorData(
LPOLEDOC lpOleDoc,
LPLINERANGE lplrSel
);
LPMONIKER OleDoc_GetFullMoniker(LPOLEDOC lpOleDoc, DWORD dwAssign);
void OleDoc_GetExtent(LPOLEDOC lpOleDoc, LPSIZEL lpsizel);
void OleDoc_DocRenamedUpdate(LPOLEDOC lpOleDoc, LPMONIKER lpmkDoc);
void OleDoc_CopyCommand(LPOLEDOC lpSrcOleDoc);
void OleDoc_PasteCommand(LPOLEDOC lpOleDoc);
void OleDoc_PasteSpecialCommand(LPOLEDOC lpOleDoc);
LPOUTLINEDOC OleDoc_CreateDataTransferDoc(LPOLEDOC lpSrcOleDoc);
BOOL OleDoc_PasteFromData(
LPOLEDOC lpOleDoc,
LPDATAOBJECT lpSrcDataObj,
BOOL fLocalDataObj,
BOOL fLink
);
BOOL OleDoc_PasteFormatFromData(
LPOLEDOC lpOleDoc,
CLIPFORMAT cfFormat,
LPDATAOBJECT lpSrcDataObj,
BOOL fLocalDataObj,
BOOL fLink,
BOOL fDisplayAsIcon,
HGLOBAL hMetaPict,
LPSIZEL lpSizelInSrc
);
BOOL OleDoc_QueryPasteFromData(
LPOLEDOC lpOleDoc,
LPDATAOBJECT lpSrcDataObj,
BOOL fLink
);
#if defined( USE_DRAGDROP )
BOOL OleDoc_QueryDrag( LPOLEDOC lpOleDoc, int y );
BOOL OleDoc_QueryDrop (
LPOLEDOC lpOleDoc,
DWORD grfKeyState,
POINTL pointl,
BOOL fDragScroll,
LPDWORD lpdwEffect
);
DWORD OleDoc_DoDragDrop (LPOLEDOC lpSrcOleDoc);
BOOL OleDoc_DoDragScroll(LPOLEDOC lpOleDoc, POINTL pointl);
#endif // USE_DRAGDROP
/* OleDoc::IUnknown methods (functions) */
STDMETHODIMP OleDoc_Unk_QueryInterface(
LPUNKNOWN lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_Unk_AddRef(LPUNKNOWN lpThis);
STDMETHODIMP_(ULONG) OleDoc_Unk_Release (LPUNKNOWN lpThis);
/* OleDoc::IPersistFile methods (functions) */
STDMETHODIMP OleDoc_PFile_QueryInterface(
LPPERSISTFILE lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_PFile_AddRef(LPPERSISTFILE lpThis);
STDMETHODIMP_(ULONG) OleDoc_PFile_Release (LPPERSISTFILE lpThis);
STDMETHODIMP OleDoc_PFile_GetClassID (
LPPERSISTFILE lpThis,
CLSID FAR* lpclsid
);
STDMETHODIMP OleDoc_PFile_IsDirty(LPPERSISTFILE lpThis);
STDMETHODIMP OleDoc_PFile_Load (
LPPERSISTFILE lpThis,
LPCOLESTR lpszFileName,
DWORD grfMode
);
STDMETHODIMP OleDoc_PFile_Save (
LPPERSISTFILE lpThis,
LPCOLESTR lpszFileName,
BOOL fRemember
);
STDMETHODIMP OleDoc_PFile_SaveCompleted (
LPPERSISTFILE lpThis,
LPCOLESTR lpszFileName
);
STDMETHODIMP OleDoc_PFile_GetCurFile (
LPPERSISTFILE lpThis,
LPOLESTR FAR* lplpszFileName
);
/* OleDoc::IOleItemContainer methods (functions) */
STDMETHODIMP OleDoc_ItemCont_QueryInterface(
LPOLEITEMCONTAINER lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_ItemCont_AddRef(LPOLEITEMCONTAINER lpThis);
STDMETHODIMP_(ULONG) OleDoc_ItemCont_Release(LPOLEITEMCONTAINER lpThis);
STDMETHODIMP OleDoc_ItemCont_ParseDisplayName(
LPOLEITEMCONTAINER lpThis,
LPBC lpbc,
LPOLESTR lpszDisplayName,
ULONG FAR* lpchEaten,
LPMONIKER FAR* lplpmkOut
);
STDMETHODIMP OleDoc_ItemCont_EnumObjects(
LPOLEITEMCONTAINER lpThis,
DWORD grfFlags,
LPENUMUNKNOWN FAR* lplpenumUnknown
);
STDMETHODIMP OleDoc_ItemCont_LockContainer(
LPOLEITEMCONTAINER lpThis,
BOOL fLock
);
STDMETHODIMP OleDoc_ItemCont_GetObject(
LPOLEITEMCONTAINER lpThis,
LPOLESTR lpszItem,
DWORD dwSpeedNeeded,
LPBINDCTX lpbc,
REFIID riid,
LPVOID FAR* lplpvObject
);
STDMETHODIMP OleDoc_ItemCont_GetObjectStorage(
LPOLEITEMCONTAINER lpThis,
LPOLESTR lpszItem,
LPBINDCTX lpbc,
REFIID riid,
LPVOID FAR* lplpvStorage
);
STDMETHODIMP OleDoc_ItemCont_IsRunning(
LPOLEITEMCONTAINER lpThis,
LPOLESTR lpszItem
);
/* OleDoc::IPersistFile methods (functions) */
STDMETHODIMP OleDoc_ExtConn_QueryInterface(
LPEXTERNALCONNECTION lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_ExtConn_AddRef(LPEXTERNALCONNECTION lpThis);
STDMETHODIMP_(ULONG) OleDoc_ExtConn_Release (LPEXTERNALCONNECTION lpThis);
STDMETHODIMP_(DWORD) OleDoc_ExtConn_AddConnection(
LPEXTERNALCONNECTION lpThis,
DWORD extconn,
DWORD reserved
);
STDMETHODIMP_(DWORD) OleDoc_ExtConn_ReleaseConnection(
LPEXTERNALCONNECTION lpThis,
DWORD extconn,
DWORD reserved,
BOOL fLastReleaseCloses
);
/* OleDoc::IDataObject methods (functions) */
STDMETHODIMP OleDoc_DataObj_QueryInterface (
LPDATAOBJECT lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_DataObj_AddRef(LPDATAOBJECT lpThis);
STDMETHODIMP_(ULONG) OleDoc_DataObj_Release (LPDATAOBJECT lpThis);
STDMETHODIMP OleDoc_DataObj_GetData (
LPDATAOBJECT lpThis,
LPFORMATETC lpFormatetc,
LPSTGMEDIUM lpMedium
);
STDMETHODIMP OleDoc_DataObj_GetDataHere (
LPDATAOBJECT lpThis,
LPFORMATETC lpFormatetc,
LPSTGMEDIUM lpMedium
);
STDMETHODIMP OleDoc_DataObj_QueryGetData (
LPDATAOBJECT lpThis,
LPFORMATETC lpFormatetc
);
STDMETHODIMP OleDoc_DataObj_GetCanonicalFormatEtc(
LPDATAOBJECT lpThis,
LPFORMATETC lpformatetc,
LPFORMATETC lpformatetcOut
);
STDMETHODIMP OleDoc_DataObj_SetData (
LPDATAOBJECT lpThis,
LPFORMATETC lpFormatetc,
LPSTGMEDIUM lpMedium,
BOOL fRelease
);
STDMETHODIMP OleDoc_DataObj_EnumFormatEtc(
LPDATAOBJECT lpThis,
DWORD dwDirection,
LPENUMFORMATETC FAR* lplpenumFormatEtc
);
STDMETHODIMP OleDoc_DataObj_DAdvise(
LPDATAOBJECT lpThis,
FORMATETC FAR* lpFormatetc,
DWORD advf,
LPADVISESINK lpAdvSink,
DWORD FAR* lpdwConnection
);
STDMETHODIMP OleDoc_DataObj_DUnadvise(LPDATAOBJECT lpThis,DWORD dwConnection);
STDMETHODIMP OleDoc_DataObj_EnumDAdvise(
LPDATAOBJECT lpThis,
LPENUMSTATDATA FAR* lplpenumAdvise
);
#ifdef USE_DRAGDROP
/* OleDoc::IDropSource methods (functions) */
STDMETHODIMP OleDoc_DropSource_QueryInterface(
LPDROPSOURCE lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_DropSource_AddRef( LPDROPSOURCE lpThis );
STDMETHODIMP_(ULONG) OleDoc_DropSource_Release ( LPDROPSOURCE lpThis);
STDMETHODIMP OleDoc_DropSource_QueryContinueDrag (
LPDROPSOURCE lpThis,
BOOL fEscapePressed,
DWORD grfKeyState
);
STDMETHODIMP OleDoc_DropSource_GiveFeedback (
LPDROPSOURCE lpThis,
DWORD dwEffect
);
/* OleDoc::IDropTarget methods (functions) */
STDMETHODIMP OleDoc_DropTarget_QueryInterface(
LPDROPTARGET lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleDoc_DropTarget_AddRef(LPDROPTARGET lpThis);
STDMETHODIMP_(ULONG) OleDoc_DropTarget_Release ( LPDROPTARGET lpThis);
STDMETHODIMP OleDoc_DropTarget_DragEnter (
LPDROPTARGET lpThis,
LPDATAOBJECT lpDataObj,
DWORD grfKeyState,
POINTL pointl,
LPDWORD lpdwEffect
);
STDMETHODIMP OleDoc_DropTarget_DragOver (
LPDROPTARGET lpThis,
DWORD grfKeyState,
POINTL pointl,
LPDWORD lpdwEffect
);
STDMETHODIMP OleDoc_DropTarget_DragLeave ( LPDROPTARGET lpThis);
STDMETHODIMP OleDoc_DropTarget_Drop (
LPDROPTARGET lpThis,
LPDATAOBJECT lpDataObj,
DWORD grfKeyState,
POINTL pointl,
LPDWORD lpdwEffect
);
#endif // USE_DRAGDROP
/*************************************************************************
** class APPCLASSFACTORY
** APPCLASSFACTORY implements the IClassFactory interface. it
** instantiates document instances of the correct type depending on
** how the application is compiled (either ServerDoc or ContainerDoc
** instances). by implementing this
** interface in a seperate interface from the App object itself, it
** is easier to manage when the IClassFactory should be
** registered/revoked. when the OleApp object is first initialized
** in OleApp_InitInstance an instance of APPCLASSFACTORY is created
** and registered (CoRegisterClassObject called). when the App
** object gets destroyed (in OleApp_Destroy) this APPCLASSFACTORY is
** revoked (CoRevokeClassObject called) and released. the simple
** fact that the IClassFactory is registered does not on its own keep
** the application alive.
*************************************************************************/
typedef struct tagAPPCLASSFACTORY {
IClassFactoryVtbl FAR* m_lpVtbl;
UINT m_cRef;
#if defined( _DEBUG )
LONG m_cSvrLock; // total count of LockServer locks
// (for debugging purposes only)
#endif
} APPCLASSFACTORY, FAR* LPAPPCLASSFACTORY;
/* PUBLIC FUNCTIONS */
LPCLASSFACTORY WINAPI AppClassFactory_Create(void);
/* interface IClassFactory implementation */
STDMETHODIMP AppClassFactory_QueryInterface(
LPCLASSFACTORY lpThis, REFIID riid, LPVOID FAR* ppvObj);
STDMETHODIMP_(ULONG) AppClassFactory_AddRef(LPCLASSFACTORY lpThis);
STDMETHODIMP_(ULONG) AppClassFactory_Release(LPCLASSFACTORY lpThis);
STDMETHODIMP AppClassFactory_CreateInstance (
LPCLASSFACTORY lpThis,
LPUNKNOWN lpUnkOuter,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP AppClassFactory_LockServer (
LPCLASSFACTORY lpThis,
BOOL fLock
);
/*************************************************************************
** class OLEAPP : OUTLINEAPP
** OLEAPP is an extention to the base OUTLINEAPP object (structure)
** that adds common OLE 2.0 functionality used by both the server
** and container versions. This is an abstract class. You do not
** instantiate an instance of OLEAPP directly but instead
** instantiate one of its concrete subclasses: SERVERAPP or
** CONTAINERAPP. There is one instance of an document application
** object created per running application instance. This
** object holds many fields that could otherwise be organized as
** global variables. The OLEAPP class inherits all fields
** from the OUTLINEAPP class. This inheritance is achieved by including a
** member variable of type OUTLINEAPP as the first field in the OLEAPP
** structure. Thus a pointer to a OLEAPP object can be cast to be
** a pointer to a OUTLINEAPP object.
*************************************************************************/
typedef struct tagOLEAPP {
OUTLINEAPP m_OutlineApp; // inherits all fields of OutlineApp
ULONG m_cRef; // total ref count for app
ULONG m_cDoc; // total count of open documents
BOOL m_fUserCtrl; // does user control life-time of app?
DWORD m_dwRegClassFac; // value returned by CoRegisterClassObject
LPCLASSFACTORY m_lpClassFactory;// ptr to allocated ClassFactory instance
#if defined( USE_MSGFILTER )
LPMESSAGEFILTER m_lpMsgFilter; // ptr to allocated MsgFilter instance
MSGPENDINGPROC m_lpfnMsgPending;// ptr to msg pending callback function
#endif // USE_MSGFILTER
BOOL m_fOleInitialized; // was OleInitialize called
UINT m_cModalDlgActive; // count of modal dialogs up; 0 = no dlg.
UINT m_cfEmbedSource; // OLE 2.0 clipboard format
UINT m_cfEmbeddedObject; // OLE 2.0 clipboard format
UINT m_cfLinkSource; // OLE 2.0 clipboard format
UINT m_cfObjectDescriptor; // OLE 2.0 clipboard format
UINT m_cfLinkSrcDescriptor; // OLE 2.0 clipboard format
UINT m_cfFileName; // std Windows clipboard format
FORMATETC m_arrDocGetFmts[MAXNOFMTS]; // fmts offered by copy & GetData
UINT m_nDocGetFmts; // no of fmtetc's for GetData
OLEUIPASTEENTRY m_arrPasteEntries[MAXNOFMTS]; // input for PasteSpl.
int m_nPasteEntries; // input for PasteSpl.
UINT m_arrLinkTypes[MAXNOLINKTYPES]; // input for PasteSpl.
int m_nLinkTypes; // input for PasteSpl.
#if defined( USE_DRAGDROP )
int m_nDragDelay; // time delay (in msec) before drag should start
int m_nDragMinDist; // min. distance (radius) before drag should start
int m_nScrollDelay; // time delay (in msec) before scroll should start
int m_nScrollInset; // Border inset distance to start drag scroll
int m_nScrollInterval; // scroll interval time (in msec)
#if defined( IF_SPECIAL_DD_CURSORS_NEEDED )
// This would be used if the app wanted to have custom drag/drop cursors
HCURSOR m_hcursorDragNone;
HCURSOR m_hcursorDragCopy;
HCURSOR m_hcursorDragLink;
#endif // IF_SPECIAL_DD_CURSORS_NEEDED
#endif // USE_DRAGDROP
#if defined( OLE_CNTR )
HPALETTE m_hStdPal; // standard color palette for OLE
// it is a good idea for containers
// to use this standard palette
// even if they do not use colors
// themselves. this will allow
// embedded object to get a good
// distribution of colors when they
// are being drawn by the container.
//
#endif
struct CAppUnknownImpl {
IUnknownVtbl FAR* lpVtbl;
LPOLEAPP lpOleApp;
int cRef; // interface specific ref count.
} m_Unknown;
} OLEAPP;
/* ServerApp methods (functions) */
BOOL OleApp_InitInstance(LPOLEAPP lpOleApp, HINSTANCE hInst, int nCmdShow);
void OleApp_TerminateApplication(LPOLEAPP lpOleApp);
BOOL OleApp_ParseCmdLine(LPOLEAPP lpOleApp, LPSTR lpszCmdLine, int nCmdShow);
void OleApp_Destroy(LPOLEAPP lpOleApp);
BOOL OleApp_CloseAllDocsAndExitCommand(
LPOLEAPP lpOleApp,
BOOL fForceEndSession
);
void OleApp_ShowWindow(LPOLEAPP lpOleApp, BOOL fGiveUserCtrl);
void OleApp_HideWindow(LPOLEAPP lpOleApp);
void OleApp_HideIfNoReasonToStayVisible(LPOLEAPP lpOleApp);
void OleApp_DocLockApp(LPOLEAPP lpOleApp);
void OleApp_DocUnlockApp(LPOLEAPP lpOleApp, LPOUTLINEDOC lpOutlineDoc);
HRESULT OleApp_Lock(LPOLEAPP lpOleApp, BOOL fLock, BOOL fLastUnlockReleases);
ULONG OleApp_AddRef(LPOLEAPP lpOleApp);
ULONG OleApp_Release (LPOLEAPP lpOleApp);
HRESULT OleApp_QueryInterface (
LPOLEAPP lpOleApp,
REFIID riid,
LPVOID FAR* lplpUnk
);
void OleApp_RejectInComingCalls(LPOLEAPP lpOleApp, BOOL fReject);
void OleApp_DisableBusyDialogs(
LPOLEAPP lpOleApp,
BOOL FAR* lpfPrevBusyEnable,
BOOL FAR* lpfPrevNREnable
);
void OleApp_EnableBusyDialogs(
LPOLEAPP lpOleApp,
BOOL fPrevBusyEnable,
BOOL fPrevNREnable
);
void OleApp_PreModalDialog(LPOLEAPP lpOleApp, LPOLEDOC lpActiveOleDoc);
void OleApp_PostModalDialog(LPOLEAPP lpOleApp, LPOLEDOC lpActiveOleDoc);
BOOL OleApp_InitVtbls (LPOLEAPP lpOleApp);
void OleApp_InitMenu(
LPOLEAPP lpOleApp,
LPOLEDOC lpOleDoc,
HMENU hMenu
);
void OleApp_UpdateEditMenu(
LPOLEAPP lpOleApp,
LPOUTLINEDOC lpOutlineDoc,
HMENU hMenuEdit
);
BOOL OleApp_RegisterClassFactory(LPOLEAPP lpOleApp);
void OleApp_RevokeClassFactory(LPOLEAPP lpOleApp);
#if defined( USE_MSGFILTER )
BOOL OleApp_RegisterMessageFilter(LPOLEAPP lpOleApp);
void OleApp_RevokeMessageFilter(LPOLEAPP lpOleApp);
BOOL FAR PASCAL EXPORT MessagePendingProc(MSG FAR *lpMsg);
#endif // USE_MSGFILTER
void OleApp_FlushClipboard(LPOLEAPP lpOleApp);
void OleApp_NewCommand(LPOLEAPP lpOleApp);
void OleApp_OpenCommand(LPOLEAPP lpOleApp);
#if defined( OLE_CNTR )
LRESULT OleApp_QueryNewPalette(LPOLEAPP lpOleApp);
#endif // OLE_CNTR
LRESULT wSelectPalette(HWND hWnd, HPALETTE hPal, BOOL fBackground);
/* OleApp::IUnknown methods (functions) */
STDMETHODIMP OleApp_Unk_QueryInterface(
LPUNKNOWN lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) OleApp_Unk_AddRef(LPUNKNOWN lpThis);
STDMETHODIMP_(ULONG) OleApp_Unk_Release (LPUNKNOWN lpThis);
/* Function prototypes in debug.c */
void InstallMessageFilterCommand(void);
void RejectIncomingCommand(void);
#if defined( OLE_SERVER )
#include "svroutl.h"
#endif
#if defined( OLE_CNTR )
#include "cntroutl.h"
#endif
#endif // _OLEOUTL_H_
|