OWLNext    7.0
Borland's Object Windows Library for the modern age
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
ocpart.cpp
Go to the documentation of this file.
1//----------------------------------------------------------------------------
2// ObjectComponents
3// Copyright (c) 1994, 1996 by Borland International, All Rights Reserved
4//
5/// \file
6/// Implementation of TOcPart Class
7//----------------------------------------------------------------------------
8#include <ocf/pch.h>
9#include <ocf/ocstorag.h>
10#include <ocf/ocpart.h>
11#include <ocf/ocdoc.h>
12#include <ocf/ocapp.h>
13#include <ocf/ocview.h>
14
15namespace ocf {
16
17using namespace owl;
18
19const _TCHAR PartFormat[] = _T("OcPart.%d");
20const _TCHAR PartStreamName[] = _T("\03OcPart");
21
22//
23/// Construct a new part with a given temp id
24/// Must call Init method to complete initialization
25//
27:
28 OcDocument(document), BPart(0), BPartI(0), BLPartI(0), Flags(Visible),
29 Storage(0)
30{
31 AddRef(); // TUnknown defaults to 0, we need 1
32 if (!id)
34 _TCHAR name[32];
36 Name = name;
37
38 // There must be a Root IStorage associated with each document
39 //
42
43 // Create a sub-storage from the parent storage in init
44 //
46}
47
48//
49/// Old style constructor - does init in constructor -
50/// OCF messages will get passed before constructor is complete
51//
53 TRect objPos, int id)
54:
55 OcDocument(document), BPart(0), BPartI(0), BLPartI(0), Flags(Visible),
56 Storage(0)
57{
58 // Part position and size are in logical units
59 //
60 AddRef(); // TUnknown defaults to 0, we need 1
61 if (!id)
63 _TCHAR name[32];
65 Name = name;
66
67 // There must be a Root IStorage associated with each document
68 //
71
72 // Create a sub-storage from the parent storage in init
73 //
76}
77
78//
79/// Construct a part from a named stream in an oc doc's storage
80//
82:
83 OcDocument(document), BPart(0), BPartI(0), BLPartI(0), Flags(Visible),
84 Storage(0),
85 Name(name)
86{
87 AddRef(); // TUnknown defaults to 0, we need 1
88
89 // There must be an IStorage associated with each document
90 //
93
94 // Open a sub-storage from the parent storage in init
95 //
97
98 // Load our data, and then add ourselves to our document's part collection if
99 // everthing succeeds. We'll initialize our helper objects when the parts
100 // become visible.
101 //
102 Load();
103 OcDocument.GetParts().Add(this);
104}
105
106//
107//
108//
110{
111 // Detach this part from its document
112 //
113 Detach();
114
115 // double check if active part is "this" and, in case, delete it
116 if (OcDocument.GetActiveView()->GetActivePart() == this)
118
119 // Delete any associated storage
120 //
121 delete Storage;
122}
123
124//
125/// Perform common ctor initialization
126//
127bool
129{
130 if (BPart)
131 return false; // already initialized
132
133 // Part position and size are in logical units
134 //
137 if (view) {
138 view->ContainerHost->EvOcViewSetSiteRect(siteRect);
139 Pos = siteRect.Rect.TopLeft();
140 Size = siteRect.Rect.Size();
141 }
142
143 if (InitObj(initInfo)) {
144 OcDocument.GetParts().Add(this);
145 return true;
146 }
147 return false;
148}
149
150//
151//
152//
153bool
155{
156 // Initialize our helpers & then add ourselves to our document's part
157 // collection if everything succeeds
158 //
159 if (initInfo) {
160
161 // There must be an IStorage associated with each part, make sure the ctor
162 // got it OK
163 //
164 initInfo->Storage = Storage->GetIStorage();
165
166 // Create part helper
167 //
171
172 // Get the interfaces we need & then release the object itself
173 //
174 if (HRSucceeded(BPart->QueryInterface(IID_IBPart, (LPVOID *)&BPartI)))
175 BPartI->Release();
176 if (HRSucceeded(BPart->QueryInterface(IID_IBLinkable, (LPVOID *)&BLPartI)))
177 BLPartI->Release();
178
179 HRESULT hr;
180 if (!BPartI || !HRSucceeded(hr = BPartI->Init(this, initInfo))) {
181 BPart->Release();
182 BPart = 0;
184 }
185
186 Rename();
187 if (initInfo->How == ihLink) // Remember that we are a link
188 Flags |= Link;
189
190 // New parts become active when they are init'd above. Make sure that our
191 // view knows that we are active too.
192 //
193 if (initInfo->Where == iwNew) {
194 Flags |= Active;
197 activeView->ActivatePart(this);
198 }
199 }
200 return true;
201}
202
203//
204/// Delete this object. Actually, causes object to shutdown as much as possible
205/// & then releases a reference.
206//
207void
209{
210 Activate(false);
211 Close();
212 Release();
213}
214
215//
216/// Callback from TUnknown's implementation of QueryInterface
217//
220{
222 HRESULT hr;
223
224 // interfaces
225 //
227
228 // helpers
229 //
230 || (BPart && HRSucceeded(hr = BPart->QueryInterface(iid, iface)))
231 ;
232 return hr;
233}
234
235//
236/// Query server for its interfaces
237//
240{
243}
244
245//
246/// Disconnect servers by closing & releasing our BOle helper
247//
248bool
250{
251 if (!BPartI)
252 return true;
253
254 if (BLPartI)
255 BLPartI->OnRename(0, 0);
256
257 if (HRSucceeded(BPartI->Close())) {
258 // release our BOle helper object
259 //
260 BPart->Release();
261 BPart = 0;
262 BPartI = 0;
263 BLPartI = 0;
264
265 // So that it won't get created again in Draw
266 //
267 Flags |= Closing;
268 return true;
269 }
270 return false;
271}
272
273//
274/// Rename the embed site for linking
275//
276void
289
290//----------------------------------------------------------------------------
291// ISite Implementation--delegates site/view related queries/notifies to the
292// active view of this part
293//
294
295//
296/// Show/hide a site.
297//
300{
302
303 // When this part is activated, the site is hidden. This is a good time to
304 // make sure our state is in sync.
305 //
306 if (!show) {
307 // Make sure the view knows about the active part
308 //
309 Flags |= Active;
311 if (view) {
312 view->ActivatePart(this);
313 view->ContainerHost->EvOcViewPartActivate(*this);
314 }
315 }
316 return HR_NOERROR;
317}
318
319//
320/// Discard undo stack for our associated [the active] view
321//
324{
325 return HR_NOERROR;
326}
327
328//
329/// Retrieve the site rect [relative to the active view?], and optionally the
330/// view's rect too?
331//
334{
336 if (!posRect)
337 return HR_INVALIDARG;
338
340 if (!view)
341 return HR_FAIL;
342 if (posRect) {
344 view->ContainerHost->EvOcViewGetSiteRect(siteRect);
345 *posRect = siteRect.Rect;
346
347 // If we don't know our site size yet, then fail this call. Let the server
348 // pick a size.
349 //
350 if (posRect->right-posRect->left <= 0 || posRect->bottom-posRect->top <= 0) {
351 posRect->right = posRect->left;
352 posRect->bottom = posRect->top;
353 return HR_FAIL;
354 }
355 }
356
357 if (clipRect)
358 view->GetWindowRect(clipRect);
359 return HR_NOERROR;
360}
361
362//
363/// Set the site's rect from an in-place active part. Since user is in control
364/// we generally respect both Pos & Size changes.
365//
368{
370 if (!newRect)
371 return HR_INVALIDARG;
372
374 if (!view)
375 return HR_FAIL;
376
377 // Give other views a chance to update
378 //
379 Invalidate(invView); // erase old image
380
382 view->ContainerHost->EvOcViewSetSiteRect(siteRect);
383 Size = siteRect.Rect.Size();
384 Pos = siteRect.Rect.TopLeft();
385
386 // Give other views a chance to update
387 //
388 Invalidate(invView); // refresh new image position
389 return HR_NOERROR;
390}
391
392//
393/// Set the part's site extent. This comes either after a SetPartRect, or for
394/// open editing, comes alone.
395//
398{
400 if (!newSize)
401 return HR_INVALIDARG;
402
404 if (!view)
405 return HR_FAIL;
406
407 // Only accept server's size if we don't have a size yet. Always say OK.
408 //
409// if (Size.cx > 0 && Size.cy > 0)
410// return HR_NOERROR;
411
412 // Give other views a chance to update
413 //
414 Invalidate(invView); // display new image
415
416 TSize ext(*newSize);
418
419 if (view->ContainerHost->EvOcViewSetSiteRect(siteRect))
420 Size = siteRect.Rect.Size();
421 else
422 //\\// container doesn't accept server size (keep what we have)
423 return HR_FAIL;
424
425 // Give other views a chance to update
426 //
427 Invalidate(invView); // refresh new image position
428
429 return HR_NOERROR;
430}
431
432//
433/// Get parent window for part
434//
437{
439 *hWnd = activeView->GetWindow();
440 return 0;
441}
442
443//
444/// Get zoom factor for part
445//
448{
450 if (!zoom)
451 return HR_INVALIDARG;
452
454 if (!view)
455 return HR_FAIL;
456
458 if (!view->ContainerHost->EvOcViewGetScale(scaleFactor)) {
459 zoom->xD = zoom->xN = zoom->yD = zoom->yN = 1;
460 }
461 else
462 scaleFactor.GetScaleFactor(*zoom);
463
464 return HR_NOERROR;
465}
466
467//
468/// Invalidate the site within the active view
469//
470void _IFUNC
478
479void _IFUNC
481{
483 if (view && set)
484 ::SetFocus(view->GetWindow());
485}
486
489{
490 return HR_FAIL; // never called
491}
492
493void _IFUNC
495{
496 // no need to do anything
497}
498
499//----------------------------------------------------------------------------
500
501//
502/// Save this part to storage. May be any of:
503/// - Save to our storage : sameAsLoad==1
504/// - Copy to a storage : sameAsLoad==0, remember==0
505/// - SaveAs a new storage: sameAsLoad==0, remember==1
506//
507bool
509{
512 return false;
513
515
516 // If not sameAsLoad, then we are saving to a new storage. Switch to that,
517 // at least for this save.
518 //
519 if (!sameAsLoad) {
522 }
523
524 // Create/open a stream in our storage to save part information
525 //
527
528 // Write TOcPart data into stream, Name was written by our Doc
529 //
530 if (!HRSucceeded(stream.Write(&Pos, sizeof Pos)))
531 return false;
532
533 if (!HRSucceeded(stream.Write(&Size, sizeof Size)))
534 return false;
535
536 if (!HRSucceeded(stream.Write(&Flags, sizeof Flags)))
537 return false;
538
539 // Now have actual server part write itself to this storage
540 //
541 bool result = Save(Storage->GetIStorage(), sameAsLoad, remember);
542
543 // If this is a different storage, then either save it (remember) or put
544 // it back & clean up.
545 //
546 if (!sameAsLoad) {
547 if (remember) {
548 delete oldStorage;
549 }
550 else {
551 delete Storage;
553 }
554 }
555
556 return result;
557}
558
559//
560/// Load this part from its ocpart stream in its current storage
561//
562bool
564{
565 // Open a stream with oc part information
566 //
569 return false;
570 TOcStream stream(*Storage, PartStreamName, false, statstg.grfMode);
571
572 // Read TOcPart data from stream. Server part info will be read in as needed
573 // after Init()
574 //
575 if (!HRSucceeded(stream.Read(&Pos, sizeof Pos)))
576 return false;
577
578 if (!HRSucceeded(stream.Read(&Size, sizeof Size)))
579 return false;
580
581 if (!HRSucceeded(stream.Read(&Flags, sizeof Flags)))
582 return false;
583 Flags &= ~(Closing | Active); // These Flags are not persistent
584
585 return true;
586}
587
588//
589/// Update this part's idea of its size via the server, & then return that.
590/// Use GetRect() to just get the current site rect.
591//
592TSize
594{
595 BPartI->GetPartSize(&const_cast<TSize&>(Size));
596 return Size;
597}
598
599//
600/// Set part to the new position given in logical units
601/// \note Does you update the part's location.
602/// Must explicitly call UpdateRect!
603//
604void
606{
607 Pos = pos;
608}
609
610//
611/// Set part to the new size given in logical units
612/// \note Does you update the part's location.
613/// Must explicitly call UpdateRect!
614//
615void
617{
618 Size = size;
619}
620
621//
622/// Set part to the new rect given in logical units
623//
624void
626{
627 // Use device units for Bolero
628 //
630 if (!view)
631 return;
632
634 view->ContainerHost->EvOcViewGetSiteRect(siteRect);
635 BPartI->SetPartPos(&siteRect.Rect);
636}
637
638//----------------------------------------------------------------------------
639// IBPart pass-thrus not inlined
640//
641bool
643{
646
647 if (activate && activeView->GetActivePart())
648 if (!activeView->ActivatePart(0)) // deactivate currently active part, if any
649 return false;
650
651 // Makes sure that the part gets the active view as its host.
652 // This is important in multi-view situation.
653 //
656 return false;
657
658 if (activate) {
659 Flags |= Active;
660 activeView->SetActivePart(this);
661 }
662 else {
663 Flags &= ~Active;
664 activeView->SetActivePart(0);
665 }
666 return true;
667}
668
669void
671{
672 // Load embeded object on demand
673 //
674 if (!BPartI) {
677 }
678}
679
680
681//
682/// Set data into the server object
683//
684bool
686{
688 if (HRSucceeded(BPart->QueryInterface(IID_IBPart2, (LPVOID *)&bPartI2)))
689 ((IBPart*)bPartI2)->Release();
690 else
691 return false;
692
693 return HRSucceeded(bPartI2->SetFormatData(fmt, data, release));
694}
695
696
697bool
699{
701 if (BPartI)
703 return false;
704}
705
706bool
708{
709 PRECONDITION(dc);
710
711 // Don't draw anything if we are closing down the part
712 //
713 if (Flags & Closing)
714 return true;
715
716 const RECTL posl = { pos.left, pos.top, pos.right, pos.bottom };
717 const RECTL clipl = { clip.left, clip.top, clip.right, clip.bottom };
718
719 // Load embeded object on demand
720 //
721 if (!BPartI) {
724 // Update the link
725 //
726 if (IsLink()) {
728 if (view)
729 view->UpdateLinks();
730 }
731
732 }
733
734 return HRSucceeded(BPartI->Draw(dc, &posl, &clipl, aspect, drNone));
735}
736
737bool
739{
740 if (BPartI)
741 return HRIsOK(BPartI->EnumVerbs(const_cast<TOcVerb*>(&verb)));
742
743 return false;
744}
745
746bool
748{
749 if (BPartI) {
753 activeView->SetActivePart(this); // we may be activated now...
754 return true;
755 }
756 }
757 return false;
758}
759
760int
762{
763 return OcDocument.GetParts().Detach(this);
764}
765
766void
768{
769 if (visible)
770 Flags |= Visible;
771 else
772 Flags &= ~Visible;
773
774 if (IsActive())
776 else
777 Invalidate(invView); // refresh new image position
778}
779
780
781//
782/// Set the storage for this part
783//
784void
786{
787 if (Storage && (storage == Storage->GetIStorage()))
788 return;
789
790 if (remember)
791 delete Storage;
792
793 if (storage)
795 else
796 Storage = 0;
797}
798
799
800//----------------------------------------------------------------------------
801// CdPartCollection
802//
803
807
812
813//
814/// Release parts in the collection
815//
816void
818{
819 for (int i = Count() - 1; i >= 0; i--) {
820 TOcPart* part = (TOcPart*)(*this)[i];
821 part->Release();
822 }
823}
824
825//
826/// walk thru Part collection & return the last one that logical point hits,
827/// (first one in Z order)
828//
829TOcPart*
831{
833
834 TOcPart* p = 0;
835 for (TOcPartCollectionIter i(*this); i; i++)
836 if (i.Current()->IsVisible(hitRect))
837 p = (TOcPart*)i.Current();
838 return p;
839}
840
841//
842/// Select/unselect all parts
843//
844bool
846{
847 for (TOcPartCollectionIter i(*this); i; i++)
848 i.Current()->Select(select);
849 return true;
850}
851
852int
854{
855 int ret = Base::Detach(Find(part));
856 if (ret && del)
857 const_cast<TOcPart*>(part)->Release();
858 return ret;
859}
860
861//--------------------------------- OcVerb -----------------------------------
862//
864:
865 TypeName(0),
866 VerbName(0),
867 VerbIndex(0),
868 CanDirty(false)
869{
870}
871
872} // OCF namespace
873
874//==============================================================================
875
#define CHECK(condition)
Definition checks.h:239
#define PRECONDITION(condition)
Definition checks.h:227
IBDataProvider – Supported by parts and/or sites which can be copied to the OLE2 clipboard.
Definition ocbocole.h:219
virtual HRESULT _IFUNC Save(IStorage *, BOOL fSamAsLoad, BOOL fRemember)=0
virtual HRESULT _IFUNC Draw(HDC, const RECTL *, const RECTL *, TOcAspect, TOcDraw bd=drNone)=0
virtual HRESULT _IFUNC GetPartSize(owl::TSize *)=0
virtual HRESULT _IFUNC OnRename(IBLinkable *pContainer, LPCOLESTR name)=0
IBPart2 – Supported by server objects.
Definition ocbocole.h:269
IBPart – Supported by server objects.
Definition ocbocole.h:241
virtual HRESULT _IFUNC Activate(BOOL)=0
virtual HRESULT _IFUNC Close()=0
virtual HRESULT _IFUNC SetPartPos(owl::TRect *)=0
virtual HRESULT _IFUNC Show(BOOL)=0
virtual HRESULT _IFUNC DoVerb(owl::uint)=0
virtual HRESULT _IFUNC Init(IBSite *, TOcInitInfo *)=0
virtual HRESULT _IFUNC EnumVerbs(TOcVerb *)=0
virtual HRESULT _IFUNC DoQueryInterface(const IID &iid, void **pif)=0
HRESULT BOleComponentCreate(IUnknown **retIface, IUnknown *outer, owl::uint32 idClass)
Create a BOle helper for one of our OC objects in this app.
Definition ocapp.cpp:213
OC Document class, holds parts & is a owner of views.
Definition ocdoc.h:43
TOcApp & GetOcApp()
Definition ocdoc.h:87
int AllocPartID()
Definition ocdoc.h:86
TOcStorage * GetStorage()
Definition ocdoc.h:58
TOcPartCollection & GetParts()
Definition ocdoc.h:51
TOcView * GetActiveView()
Definition ocdoc.h:76
View/Data change info.
Definition ocpart.h:216
virtual unsigned Count() const
Definition ocpart.h:185
bool SelectAll(bool select=false)
Select/unselect all parts.
Definition ocpart.cpp:845
void Clear()
Release parts in the collection.
Definition ocpart.cpp:817
int Find(TOcPart *const &part)
Definition ocpart.h:183
TOcPart * Locate(owl::TPoint &point)
walk thru Part collection & return the last one that logical point hits, (first one in Z order)
Definition ocpart.cpp:830
int Detach(TOcPart *const &part, int del=0)
Definition ocpart.cpp:853
int Add(TOcPart *const &part)
Definition ocpart.h:180
OC part class represents an embeded or linked part in a document.
Definition ocpart.h:38
bool Close()
Disconnect servers by closing & releasing our BOle helper.
Definition ocpart.cpp:249
void SetVisible(bool visible)
Definition ocpart.cpp:767
owl::TString GetName()
Definition ocpart.h:91
owl::TSize GetSize() const
Update this part's idea of its size via the server, & then return that.
Definition ocpart.cpp:593
virtual bool Init(TOcInitInfo *initInfo, owl::TRect pos)
Perform common ctor initialization.
Definition ocpart.cpp:128
void UpdateRect()
Set part to the new rect given in logical units.
Definition ocpart.cpp:625
TOcDocument & OcDocument
The OC document we are imbeded in.
Definition ocpart.h:154
owl::tstring Name
Definition ocpart.h:157
HRESULT _IFUNC DiscardUndo()
Discard undo stack for our associated [the active] view.
Definition ocpart.cpp:323
owl::uint16 Flags
Is this part Selected/Visible/Active/ALink?
Definition ocpart.h:162
void _IFUNC OnSetFocus(BOOL set)
Definition ocpart.cpp:480
int Detach()
Definition ocpart.cpp:761
void FinishLoading()
Definition ocpart.cpp:670
HRESULT QueryServer(const IID &iid, void **iface)
Query server for its interfaces.
Definition ocpart.cpp:239
bool Draw(HDC dc, const owl::TRect &pos, const owl::TRect &clip, TOcAspect aspect=asDefault)
Definition ocpart.cpp:707
TOcStorage * Storage
The storage we are in.
Definition ocpart.h:155
virtual bool InitObj(TOcInitInfo *initInfo)
Definition ocpart.cpp:154
HRESULT _IFUNC GetParentWindow(HWND *)
Get parent window for part.
Definition ocpart.cpp:436
IBLinkable * BLPartI
Definition ocpart.h:152
owl::ulong _IFUNC Release()
Definition ocpart.h:119
bool EnumVerbs(const TOcVerb &)
Definition ocpart.cpp:738
HRESULT QueryObject(const IID &iid, void **iface)
Callback from TUnknown's implementation of QueryInterface.
Definition ocpart.cpp:219
bool Activate(bool activate)
Definition ocpart.cpp:642
IBPart * BPartI
Definition ocpart.h:151
bool SetHost(IBContainer *container)
Definition ocpart.h:104
HRESULT _IFUNC SetSiteExtent(const owl::TSize *)
Set the part's site extent.
Definition ocpart.cpp:397
IUnknown * BPart
Our corresponding helper object & interfaces.
Definition ocpart.h:150
HRESULT _IFUNC SetSiteRect(const owl::TRect *)
Set the site's rect from an in-place active part.
Definition ocpart.cpp:367
owl::ulong _IFUNC AddRef()
Definition ocpart.h:118
void SetStorage(IStorage *storage, bool remember=true)
Set the storage for this part.
Definition ocpart.cpp:785
bool IsLink() const
Definition ocpart.h:81
owl::TSize Size
Definition ocpart.h:159
bool Load()
Load this part from its ocpart stream in its current storage.
Definition ocpart.cpp:563
HRESULT _IFUNC GetSiteRect(owl::TRect *, owl::TRect *)
Retrieve the site rect [relative to the active view?], and optionally the view's rect too?
Definition ocpart.cpp:333
HRESULT _IFUNC SiteShow(BOOL)
Show/hide a site.
Definition ocpart.cpp:299
void SetPos(const owl::TPoint &pos)
Set part to the new position given in logical units.
Definition ocpart.cpp:605
bool SetFormatData(TOcFormatInfo *fmt, HANDLE data, bool release)
Set data into the server object.
Definition ocpart.cpp:685
void Delete()
Delete this object.
Definition ocpart.cpp:208
void SetSize(const owl::TSize &size)
Set part to the new size given in logical units.
Definition ocpart.cpp:616
TOcPart(TOcDocument &document, int id=0)
Construct a new part with a given temp id Must call Init method to complete initialization.
Definition ocpart.cpp:26
void _IFUNC Disconnect()
Definition ocpart.cpp:494
bool Save(bool SameAsLoad=true, bool remember=true)
Save this part to storage.
Definition ocpart.cpp:508
bool DoVerb(owl::uint)
Definition ocpart.cpp:747
bool IsActive() const
Definition ocpart.h:79
void _IFUNC Invalidate(TOcInvalidate)
Invalidate the site within the active view.
Definition ocpart.cpp:471
owl::TPoint Pos
Definition ocpart.h:158
HRESULT _IFUNC GetZoom(TOcScaleInfo *scale)
Get zoom factor for part.
Definition ocpart.cpp:447
void Rename()
Rename the embed site for linking.
Definition ocpart.cpp:277
IStorage * GetIStorage()
Definition ocstorag.cpp:383
HRESULT Stat(STATSTG *pstatstg, owl::uint32 grfStatFlag)
Definition ocstorag.cpp:484
The TOcView partner is a container (viewer) of a given (server/client) document.
Definition ocview.h:136
TOcPart * GetActivePart()
Definition ocview.h:178
void SetActivePart(TOcPart *part)
Definition ocview.h:179
IUnknown * GetOuter()
Definition oleutil.h:269
@ xMissingRootIStorage
Definition except.h:104
@ xInternalPartError
Definition except.h:105
static void Check(HRESULT stat, TError err, LPCTSTR msg=0)
Definition ocstorag.cpp:58
TPoint is a support class, derived from tagPOINT.
Definition geometry.h:87
Iterator for Pointer Container.
Definition template.h:602
TRect is a mathematical class derived from tagRect.
Definition geometry.h:308
The tagSIZE struct is defined as.
Definition geometry.h:234
bool Detach(int loc)
Definition template.h:1573
#define _T(x)
Definition cygwin.h:51
Include for OC, gets common headers when precompiled headers are enabled.
Object Component Framework (COM encapsulation)
Definition appdesc.h:22
bool HRIsOK(HRESULT hr)
Definition defs.h:132
TOcAspect
Definition ocobject.h:64
@ iwStorage
Definition ocobject.h:102
@ iwNew
Definition ocobject.h:104
@ ihEmbed
Definition ocobject.h:95
@ ihLink
Definition ocobject.h:94
TOcInvalidate
Definition ocobject.h:59
@ invView
Definition ocobject.h:61
bool HRSucceeded(HRESULT hr)
Definition defs.h:131
const BCID cidBOlePart
Definition ocbocole.h:112
const TCHAR PartFormat[]
Definition ocpart.cpp:19
const TCHAR PartStreamName[]
Definition ocpart.cpp:20
const GUID & iid
Definition appdesc.h:328
class _ICLASS TOcStorage
Definition ocdoc.h:32
@ drNone
Definition ocobject.h:82
Object Windows Library (OWLNext Core)
Definition animctrl.h:22
unsigned int uint
Definition number.h:25
Definition of TOcApp application connection class.
Definition of TOcDocument Class.
interface _ICLASS IStorage
Definition ocdoc.h:25
#define HR_INVALIDARG
Definition defs.h:78
#define HR_NOERROR
Definition defs.h:73
#define HR_FAIL
Definition defs.h:83
Definition of TOcPart class.
Definition of TOcStorage & TOcStream classes.
Definition of Compound Document TOcView Class.
#define _IFUNC
Definition oleutil.h:28