Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

855 lines
31 KiB

/*************************************************************************
**
** OLE 2.0 Container Sample Code
**
** cntroutl.h
**
** This file contains file contains data structure defintions,
** function prototypes, constants, etc. used by the OLE 2.0 container
** 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 (Container) sample app
**
** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
**
*************************************************************************/
#if !defined( _CNTROUTL_H_ )
#define _CNTROUTL_H_
#ifndef RC_INVOKED
#pragma message ("INCLUDING CNTROUTL.H from " __FILE__)
#endif /* RC_INVOKED */
#include "oleoutl.h"
#include "cntrrc.h"
// REVIEW: should load from string resource
#define DEFOBJNAMEPREFIX "Obj" // Prefix for auto-generated stg names
#define DEFOBJWIDTH 5000 // default size for embedded obj.
#define DEFOBJHEIGHT 5000 // default size for embedded obj.
#define UNKNOWN_OLEOBJ_TYPE "Unknown OLE Object Type"
#define szOLEOBJECT "Object"
#define szOLELINK "Link"
#define CONTAINERDOCFORMAT "CntrOutl" // CF_CntrOutl format name
/* Forward definition of types */
typedef struct tagCONTAINERDOC FAR* LPCONTAINERDOC;
typedef struct tagCONTAINERLINE FAR* LPCONTAINERLINE;
// Flags to specify type of OLECREATE???FROMDATA call required
typedef enum tagOLECREATEFROMDATATYPE {
OLECREATEFROMDATA_LINK = 1,
OLECREATEFROMDATA_OBJECT = 2,
OLECREATEFROMDATA_STATIC = 3
} OLECREATEFROMDATATYPE;
/*************************************************************************
** class CONTAINERLINE : LINE
** The class CONTAINERLINE is a concrete subclass of the abstract base
** class LINE. The CONTAINERLINE maintains all information about the
** place within the CONTAINERDOC that an OLE object is embedded. This
** object implements the following OLE 2.0 interfaces:
** IOleClientSite
** IAdviseSink
** In the CntrOutl client app either CONTAINERLINE objects or TEXTLINE
** objects can be created. The CONTAINERLINE class inherits all fields
** from the LINE class. This inheritance is achieved by including a
** member variable of type LINE as the first field in the CONTAINERLINE
** structure. Thus a pointer to a CONTAINERLINE object can be cast to be
** a pointer to a LINE object.
** Each CONTAINERLINE object that is created in added to the LINELIST of
** the associated OUTLINEDOC document.
*************************************************************************/
typedef struct tagCONTAINERLINE {
LINE m_Line; // ContainerLine inherits fields of Line
ULONG m_cRef; // total ref count for line
char m_szStgName[CWCSTORAGENAME]; // stg name w/i cntr stg
BOOL m_fObjWinOpen; // is obj window open? if so, shade obj.
BOOL m_fMonikerAssigned; // has a moniker been assigned to obj
DWORD m_dwDrawAspect; // current display aspect for obj
// (either DVASPECT_CONTENT or
// DVASPECT_ICON)
BOOL m_fGuardObj; // Guard against re-entrancy while
// loading or creating an OLE object
BOOL m_fDoGetExtent; // indicates extents may have changed
BOOL m_fDoSetExtent; // obj was resized when not running
// IOO::SetExtent needed on next run
SIZEL m_sizeInHimetric; // extents of obj in himetric units
LPSTORAGE m_lpStg; // open pstg when obj is loaded
LPCONTAINERDOC m_lpDoc; // ptr to associated client doc
LPOLEOBJECT m_lpOleObj; // ptr to IOleObject* when obj is loaded
LPVIEWOBJECT2 m_lpViewObj2; // ptr to IViewObject2* when obj is loaded
LPPERSISTSTORAGE m_lpPersistStg;// ptr to IPersistStorage* when obj loaded
LPOLELINK m_lpOleLink; // ptr to IOleLink* if link is loaded
DWORD m_dwLinkType; // is it a linked object?
// 0 -- NOT a link
// OLEUPDATE_ALWAYS (1) -- auto link
// OLEUPDATE_ONCALL (3) -- man. link
BOOL m_fLinkUnavailable; // is the link unavailable?
LPSTR m_lpszShortType;// short type name of OLE object needed
// to make the Edit.Object.Verb menu
int m_nHorizScrollShift; // horiz scroll shift required
// for object's inplace window.
// (note: this is ICNTROTL specific)
#if defined( INPLACE_CNTR )
BOOL m_fIpActive; // is object in-place active (undo valid)
BOOL m_fUIActive; // is object UIActive
BOOL m_fIpVisible; // is object's in-place window visible
BOOL m_fInsideOutObj;// is obj inside-out (visible when loaded)
LPOLEINPLACEOBJECT m_lpOleIPObj; // IOleInPlaceObject* of in-place obj
BOOL m_fIpChangesUndoable; // can in-place object do undo
BOOL m_fIpServerRunning; // is in-place server running
HWND m_hWndIpObject;
struct COleInPlaceSiteImpl {
IOleInPlaceSiteVtbl FAR* lpVtbl;
LPCONTAINERLINE lpContainerLine;
int cRef; // interface specific ref count.
} m_OleInPlaceSite;
#endif // INPLACE_CNTR
struct CUnknownImpl {
IUnknownVtbl FAR* lpVtbl;
LPCONTAINERLINE lpContainerLine;
int cRef; // interface specific ref count.
} m_Unknown;
struct COleClientSiteImpl {
IOleClientSiteVtbl FAR* lpVtbl;
LPCONTAINERLINE lpContainerLine;
int cRef; // interface specific ref count.
} m_OleClientSite;
struct CAdviseSinkImpl {
IAdviseSinkVtbl FAR* lpVtbl;
LPCONTAINERLINE lpContainerLine;
int cRef; // interface specific ref count.
} m_AdviseSink;
} CONTAINERLINE;
/* ContainerLine methods (functions) */
void ContainerLine_Init(LPCONTAINERLINE lpContainerLine, int nTab, HDC hDC);
BOOL ContainerLine_SetupOleObject(
LPCONTAINERLINE lpContainerLine,
BOOL fDisplayAsIcon,
HGLOBAL hMetaPict
);
LPCONTAINERLINE ContainerLine_Create(
DWORD dwOleCreateType,
HDC hDC,
UINT nTab,
LPCONTAINERDOC lpContainerDoc,
LPCLSID lpclsid,
LPSTR lpszFileName,
BOOL fDisplayAsIcon,
HGLOBAL hMetaPict,
LPSTR lpszStgName
);
LPCONTAINERLINE ContainerLine_CreateFromData(
HDC hDC,
UINT nTab,
LPCONTAINERDOC lpContainerDoc,
LPDATAOBJECT lpSrcDataObj,
DWORD dwCreateType,
CLIPFORMAT cfFormat,
BOOL fDisplayAsIcon,
HGLOBAL hMetaPict,
LPSTR lpszStgName
);
ULONG ContainerLine_AddRef(LPCONTAINERLINE lpContainerLine);
ULONG ContainerLine_Release(LPCONTAINERLINE lpContainerLine);
HRESULT ContainerLine_QueryInterface(
LPCONTAINERLINE lpContainerLine,
REFIID riid,
LPVOID FAR* lplpUnk
);
BOOL ContainerLine_CloseOleObject(
LPCONTAINERLINE lpContainerLine,
DWORD dwSaveOption
);
void ContainerLine_UnloadOleObject(
LPCONTAINERLINE lpContainerLine,
DWORD dwSaveOption
);
void ContainerLine_Delete(LPCONTAINERLINE lpContainerLine);
void ContainerLine_Destroy(LPCONTAINERLINE lpContainerLine);
BOOL ContainerLine_CopyToDoc(
LPCONTAINERLINE lpSrcLine,
LPOUTLINEDOC lpDestDoc,
int nIndex
);
BOOL ContainerLine_LoadOleObject(LPCONTAINERLINE lpContainerLine);
BOOL ContainerLine_UpdateExtent(
LPCONTAINERLINE lpContainerLine,
LPSIZEL lpsizelHim
);
BOOL ContainerLine_DoVerb(
LPCONTAINERLINE lpContainerLine,
LONG iVerb,
LPMSG lpMsg,
BOOL fMessage,
BOOL fAction
);
LPUNKNOWN ContainerLine_GetOleObject(
LPCONTAINERLINE lpContainerLine,
REFIID riid
);
HRESULT ContainerLine_RunOleObject(LPCONTAINERLINE lpContainerLine);
BOOL ContainerLine_ProcessOleRunError(
LPCONTAINERLINE lpContainerLine,
HRESULT hrErr,
BOOL fAction,
BOOL fMenuInvoked
);
HRESULT ContainerLine_ReCreateLinkBecauseClassDiff(
LPCONTAINERLINE lpContainerLine
);
BOOL ContainerLine_IsOleLink(LPCONTAINERLINE lpContainerLine);
void ContainerLine_BindLinkIfLinkSrcIsRunning(LPCONTAINERLINE lpContainerLine);
void ContainerLine_Draw(
LPCONTAINERLINE lpContainerLine,
HDC hDC,
LPRECT lpRect,
LPRECT lpRectWBounds,
BOOL fHighlight
);
void ContainerLine_DrawSelHilight(
LPCONTAINERLINE lpContainerLine,
HDC hDC,
LPRECT lpRect,
UINT itemAction,
UINT itemState
);
BOOL ContainerLine_Edit(LPCONTAINERLINE lpContainerLine,HWND hWndDoc,HDC hDC);
void ContainerLine_SetHeightInHimetric(LPCONTAINERLINE lpContainerLine, int nHeight);
void ContainerLine_SetLineHeightFromObjectExtent(
LPCONTAINERLINE lpContainerLine,
LPSIZEL lpsizelOleObject
);
BOOL ContainerLine_SaveToStm(
LPCONTAINERLINE lpContainerLine,
LPSTREAM lpLLStm
);
BOOL ContainerLine_SaveOleObjectToStg(
LPCONTAINERLINE lpContainerLine,
LPSTORAGE lpSrcStg,
LPSTORAGE lpDestStg,
BOOL fRemember
);
LPLINE ContainerLine_LoadFromStg(
LPSTORAGE lpSrcStg,
LPSTREAM lpLLStm,
LPOUTLINEDOC lpDestDoc
);
LPMONIKER ContainerLine_GetRelMoniker(
LPCONTAINERLINE lpContainerLine,
DWORD dwAssign
);
LPMONIKER ContainerLine_GetFullMoniker(
LPCONTAINERLINE lpContainerLine,
DWORD dwAssign
);
int ContainerLine_GetTextLen(LPCONTAINERLINE lpContainerLine);
void ContainerLine_GetTextData(LPCONTAINERLINE lpContainerLine,LPSTR lpszBuf);
BOOL ContainerLine_GetOutlineData(
LPCONTAINERLINE lpContainerLine,
LPTEXTLINE lpBuf
);
void ContainerLine_GetOleObjectRectInPixels(
LPCONTAINERLINE lpContainerLine,
LPRECT lprc
);
void ContainerLine_GetPosRect(
LPCONTAINERLINE lpContainerLine,
LPRECT lprcPosRect
);
void ContainerLine_GetOleObjectSizeInHimetric(
LPCONTAINERLINE lpContainerLine,
LPSIZEL lpsizel
);
#if defined( INPLACE_CNTR )
void ContainerLine_UIDeactivate(LPCONTAINERLINE lpContainerLine);
void ContainerLine_InPlaceDeactivate(LPCONTAINERLINE lpContainerLine);
void ContainerLine_UpdateInPlaceObjectRects(
LPCONTAINERLINE lpContainerLine,
LPRECT lprcClipRect
);
void ContainerLine_ContextSensitiveHelp(
LPCONTAINERLINE lpContainerLine,
BOOL fEnterMode
);
void ContainerLine_ForwardPaletteChangedMsg(
LPCONTAINERLINE lpContainerLine,
HWND hwndPalChg
);
void ContainerDoc_ContextSensitiveHelp(
LPCONTAINERDOC lpContainerDoc,
BOOL fEnterMode,
BOOL fInitiatedByObj
);
void ContainerDoc_ForwardPaletteChangedMsg(
LPCONTAINERDOC lpContainerDoc,
HWND hwndPalChg
);
#endif // INPLACE_CNTR
/* ContainerLine::IUnknown methods (functions) */
STDMETHODIMP CntrLine_Unk_QueryInterface(
LPUNKNOWN lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) CntrLine_Unk_AddRef(LPUNKNOWN lpThis);
STDMETHODIMP_(ULONG) CntrLine_Unk_Release(LPUNKNOWN lpThis);
/* ContainerLine::IOleClientSite methods (functions) */
STDMETHODIMP CntrLine_CliSite_QueryInterface(
LPOLECLIENTSITE lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) CntrLine_CliSite_AddRef(LPOLECLIENTSITE lpThis);
STDMETHODIMP_(ULONG) CntrLine_CliSite_Release(LPOLECLIENTSITE lpThis);
STDMETHODIMP CntrLine_CliSite_SaveObject(LPOLECLIENTSITE lpThis);
STDMETHODIMP CntrLine_CliSite_GetMoniker(
LPOLECLIENTSITE lpThis,
DWORD dwAssign,
DWORD dwWhichMoniker,
LPMONIKER FAR* lplpmk
);
STDMETHODIMP CntrLine_CliSite_GetContainer(
LPOLECLIENTSITE lpThis,
LPOLECONTAINER FAR* lplpContainer
);
STDMETHODIMP CntrLine_CliSite_ShowObject(LPOLECLIENTSITE lpThis);
STDMETHODIMP CntrLine_CliSite_OnShowWindow(LPOLECLIENTSITE lpThis,BOOL fShow);
STDMETHODIMP CntrLine_CliSite_RequestNewObjectLayout(LPOLECLIENTSITE lpThis);
/* ContainerLine::IAdviseSink methods (functions) */
STDMETHODIMP CntrLine_AdvSink_QueryInterface(
LPADVISESINK lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) CntrLine_AdvSink_AddRef(LPADVISESINK lpThis);
STDMETHODIMP_(ULONG) CntrLine_AdvSink_Release (LPADVISESINK lpThis);
STDMETHODIMP_(void) CntrLine_AdvSink_OnDataChange(
LPADVISESINK lpThis,
FORMATETC FAR* lpFormatetc,
STGMEDIUM FAR* lpStgmed
);
STDMETHODIMP_(void) CntrLine_AdvSink_OnViewChange(
LPADVISESINK lpThis,
DWORD aspects,
LONG lindex
);
STDMETHODIMP_(void) CntrLine_AdvSink_OnRename(
LPADVISESINK lpThis,
LPMONIKER lpmk
);
STDMETHODIMP_(void) CntrLine_AdvSink_OnSave(LPADVISESINK lpThis);
STDMETHODIMP_(void) CntrLine_AdvSink_OnClose(LPADVISESINK lpThis);
#if defined( INPLACE_CNTR )
/* ContainerLine::IOleInPlaceSite methods (functions) */
STDMETHODIMP CntrLine_IPSite_QueryInterface(
LPOLEINPLACESITE lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) CntrLine_IPSite_AddRef(LPOLEINPLACESITE lpThis);
STDMETHODIMP_(ULONG) CntrLine_IPSite_Release(LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_GetWindow(
LPOLEINPLACESITE lpThis,
HWND FAR* lphwnd
);
STDMETHODIMP CntrLine_IPSite_ContextSensitiveHelp(
LPOLEINPLACESITE lpThis,
BOOL fEnterMode
);
STDMETHODIMP CntrLine_IPSite_CanInPlaceActivate(LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_OnInPlaceActivate(LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_OnUIActivate (LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_GetWindowContext(
LPOLEINPLACESITE lpThis,
LPOLEINPLACEFRAME FAR* lplpFrame,
LPOLEINPLACEUIWINDOW FAR* lplpDoc,
LPRECT lprcPosRect,
LPRECT lprcClipRect,
LPOLEINPLACEFRAMEINFO lpFrameInfo
);
STDMETHODIMP CntrLine_IPSite_Scroll(
LPOLEINPLACESITE lpThis,
SIZE scrollExtent
);
STDMETHODIMP CntrLine_IPSite_OnUIDeactivate(
LPOLEINPLACESITE lpThis,
BOOL fUndoable
);
STDMETHODIMP CntrLine_IPSite_OnInPlaceDeactivate(LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_DiscardUndoState(LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_DeactivateAndUndo(LPOLEINPLACESITE lpThis);
STDMETHODIMP CntrLine_IPSite_OnPosRectChange(
LPOLEINPLACESITE lpThis,
LPCRECT lprcPosRect
);
#endif // INPLACE_CNTR
/* struct definition for persistant data storage of ContainerLine */
#pragma pack(push, 2)
typedef struct tagCONTAINERLINERECORD_ONDISK
{
char m_szStgName[CWCSTORAGENAME]; // stg name w/i cntr stg
USHORT m_fMonikerAssigned; // has a moniker been assigned to obj
DWORD m_dwDrawAspect; // current display aspect for obj
// (either DVASPECT_CONTENT or
// DVASPECT_ICON)
SIZEL m_sizeInHimetric; // extents of obj in himetric units
DWORD m_dwLinkType; // is it a linked object?
// 0 -- NOT a link
// OLEUPDATE_ALWAYS (1) -- auto link
// OLEUPDATE_ONCALL (3) -- man. link
USHORT m_fDoSetExtent; // obj was resized when not running
// IOO::SetExtent needed on next run
} CONTAINERLINERECORD_ONDISK, FAR* LPCONTAINERLINERECORD_ONDISK;
#pragma pack(pop)
typedef struct tagCONTAINERLINERECORD {
char m_szStgName[CWCSTORAGENAME]; // stg name w/i cntr stg
BOOL m_fMonikerAssigned; // has a moniker been assigned to obj
DWORD m_dwDrawAspect; // current display aspect for obj
// (either DVASPECT_CONTENT or
// DVASPECT_ICON)
SIZEL m_sizeInHimetric; // extents of obj in himetric units
DWORD m_dwLinkType; // is it a linked object?
// 0 -- NOT a link
// OLEUPDATE_ALWAYS (1) -- auto link
// OLEUPDATE_ONCALL (3) -- man. link
BOOL m_fDoSetExtent; // obj was resized when not running
// IOO::SetExtent needed on next run
} CONTAINERLINERECORD, FAR* LPCONTAINERLINERECORD;
/*************************************************************************
** class CONTAINERDOC : OUTLINEDOC
** CONTAINERDOC is an extention to the base OUTLINEDOC object (structure)
** that adds OLE 2.0 Container functionality. There is one instance of
** CONTAINERDOC object created per document open in the app. The SDI
** version of the app supports one CONTAINERDOC at a time. The MDI
** version of the app can manage multiple documents at one time.
** The CONTAINERDOC 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
** CONTAINERDOC structure. Thus a pointer to a CONTAINERDOC object
** can be cast to be a pointer to a OUTLINEDOC object.
*************************************************************************/
typedef struct tagCONTAINERDOC {
OLEDOC m_OleDoc; // ContainerDoc inherits all fields of OleDoc
ULONG m_nNextObjNo; // next available obj no. for stg name
LPSTORAGE m_lpNewStg; // holds new pStg when SaveAs is pending
BOOL m_fEmbeddedObjectAvail; // is single OLE embed copied to doc
CLSID m_clsidOleObjCopied; // if obj copied, CLSID of obj
DWORD m_dwAspectOleObjCopied; // if obj copied, draw aspect of obj
LPCONTAINERLINE m_lpSrcContainerLine; // src line if doc created for copy
BOOL m_fShowObject; // show object flag
#if defined( INPLACE_CNTR )
LPCONTAINERLINE m_lpLastIpActiveLine; // last in-place active line
LPCONTAINERLINE m_lpLastUIActiveLine; // last UIActive line
HWND m_hWndUIActiveObj; // HWND of UIActive obj.
BOOL m_fAddMyUI; // if adding tools/menu postponed
int m_cIPActiveObjects;
#if defined( INPLACE_CNTRSVR )
LPOLEINPLACEFRAME m_lpTopIPFrame; // ptr to Top In-place frame.
LPOLEINPLACEFRAME m_lpTopIPDoc; // ptr to Top In-place Doc window.
HMENU m_hSharedMenu; // combined obj/cntr menu
// NULL if we are top container
HOLEMENU m_hOleMenu; // returned by OleCreateMenuDesc.
// NULL if we are top container
#endif // INPLACE_CNTRSVR
#endif // INPLACE_CNTR
struct CDocOleUILinkContainerImpl {
IOleUILinkContainerVtbl FAR* lpVtbl;
LPCONTAINERDOC lpContainerDoc;
int cRef; // interface specific ref count.
} m_OleUILinkContainer;
} CONTAINERDOC;
/* ContainerDoc methods (functions) */
BOOL ContainerDoc_Init(LPCONTAINERDOC lpContainerDoc, BOOL fDataTransferDoc);
LPCONTAINERLINE ContainerDoc_GetNextLink(
LPCONTAINERDOC lpContainerDoc,
LPCONTAINERLINE lpContainerLine
);
void ContainerDoc_UpdateLinks(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_SetShowObjectFlag(LPCONTAINERDOC lpContainerDoc, BOOL fShow);
BOOL ContainerDoc_GetShowObjectFlag(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_InsertOleObjectCommand(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_EditLinksCommand(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_PasteLinkCommand(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_ConvertCommand(
LPCONTAINERDOC lpContainerDoc,
BOOL fServerNotRegistered
);
BOOL ContainerDoc_PasteFormatFromData(
LPCONTAINERDOC lpContainerDoc,
CLIPFORMAT cfFormat,
LPDATAOBJECT lpSrcDataObj,
BOOL fLocalDataObj,
BOOL fLink,
BOOL fDisplayAsIcon,
HGLOBAL hMetaPict,
LPSIZEL lpSizelInSrc
);
int ContainerDoc_PasteCntrOutlData(
LPCONTAINERDOC lpDestContainerDoc,
LPSTORAGE lpSrcStg,
int nStartIndex
);
BOOL ContainerDoc_QueryPasteFromData(
LPCONTAINERDOC lpContainerDoc,
LPDATAOBJECT lpSrcDataObj,
BOOL fLink
);
int ContainerDoc_PasteOleObject(
LPCONTAINERDOC lpContainerDoc,
LPDATAOBJECT lpSrcDataObj,
DWORD dwCreateType,
CLIPFORMAT cfFormat,
int nIndex,
BOOL fDisplayAsIcon,
HGLOBAL hMetaPict,
LPSIZEL lpSizelInSrc
);
BOOL ContainerDoc_CloseAllOleObjects(
LPCONTAINERDOC lpContainerDoc,
DWORD dwSaveOption
);
void ContainerDoc_UnloadAllOleObjectsOfClass(
LPCONTAINERDOC lpContainerDoc,
REFCLSID rClsid,
DWORD dwSaveOption
);
void ContainerDoc_InformAllOleObjectsDocRenamed(
LPCONTAINERDOC lpContainerDoc,
LPMONIKER lpmkDoc
);
void ContainerDoc_UpdateExtentOfAllOleObjects(LPCONTAINERDOC lpContainerDoc);
BOOL ContainerDoc_SaveToFile(
LPCONTAINERDOC lpContainerDoc,
LPCSTR lpszFileName,
UINT uFormat,
BOOL fRemember
);
void ContainerDoc_ContainerLineDoVerbCommand(
LPCONTAINERDOC lpContainerDoc,
LONG iVerb
);
void ContainerDoc_GetNextStgName(
LPCONTAINERDOC lpContainerDoc,
LPSTR lpszStgName,
int nLen
);
BOOL ContainerDoc_IsStgNameUsed(
LPCONTAINERDOC lpContainerDoc,
LPSTR lpszStgName
);
LPSTORAGE ContainerDoc_GetStg(LPCONTAINERDOC lpContainerDoc);
HRESULT ContainerDoc_GetObject(
LPCONTAINERDOC lpContainerDoc,
LPOLESTR lpszItem,
DWORD dwSpeedNeeded,
REFIID riid,
LPVOID FAR* lplpvObject
);
HRESULT ContainerDoc_GetObjectStorage(
LPCONTAINERDOC lpContainerDoc,
LPOLESTR lpszItem,
LPSTORAGE FAR* lplpStg
);
HRESULT ContainerDoc_IsRunning(LPCONTAINERDOC lpContainerDoc, LPOLESTR lpszItem);
LPUNKNOWN ContainerDoc_GetSingleOleObject(
LPCONTAINERDOC lpContainerDoc,
REFIID riid,
LPCONTAINERLINE FAR* lplpContainerLine
);
BOOL ContainerDoc_IsSelAnOleObject(
LPCONTAINERDOC lpContainerDoc,
REFIID riid,
LPUNKNOWN FAR* lplpvObj,
int FAR* lpnIndex,
LPCONTAINERLINE FAR* lplpContainerLine
);
HRESULT ContainerDoc_GetData (
LPCONTAINERDOC lpContainerDoc,
LPFORMATETC lpformatetc,
LPSTGMEDIUM lpMedium
);
HRESULT ContainerDoc_GetDataHere (
LPCONTAINERDOC lpContainerDoc,
LPFORMATETC lpformatetc,
LPSTGMEDIUM lpMedium
);
HRESULT ContainerDoc_QueryGetData (
LPCONTAINERDOC lpContainerDoc,
LPFORMATETC lpformatetc
);
HRESULT ContainerDoc_SetData (
LPCONTAINERDOC lpContainerDoc,
LPFORMATETC lpformatetc,
LPSTGMEDIUM lpmedium,
BOOL fRelease
);
HRESULT ContainerDoc_EnumFormatEtc(
LPCONTAINERDOC lpContainerDoc,
DWORD dwDirection,
LPENUMFORMATETC FAR* lplpenumFormatEtc
);
BOOL ContainerDoc_SetupDocGetFmts(
LPCONTAINERDOC lpContainerDoc,
LPCONTAINERLINE lpContainerLine
);
#if defined( INPLACE_CNTR )
void ContainerDoc_ShutDownLastInPlaceServerIfNotNeeded(
LPCONTAINERDOC lpContainerDoc,
LPCONTAINERLINE lpNextActiveLine
);
BOOL ContainerDoc_IsUIDeactivateNeeded(
LPCONTAINERDOC lpContainerDoc,
POINT pt
);
HWND ContainerDoc_GetUIActiveWindow(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_UpdateInPlaceObjectRects(LPCONTAINERDOC lpContainerDoc, int nIndex);
void ContainerDoc_GetClipRect(
LPCONTAINERDOC lpContainerDoc,
LPRECT lprcClipRect
);
void ContainerDoc_FrameWindowResized(LPCONTAINERDOC lpContainerDoc);
LPOLEINPLACEFRAME ContainerDoc_GetTopInPlaceFrame(
LPCONTAINERDOC lpContainerDoc
);
void ContainerDoc_GetSharedMenuHandles(
LPCONTAINERDOC lpContainerDoc,
HMENU FAR* lphSharedMenu,
HOLEMENU FAR* lphOleMenu
);
void ContainerDoc_RemoveFrameLevelTools(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_AddFrameLevelUI(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_AddFrameLevelTools(LPCONTAINERDOC lpContainerDoc);
#if defined( INPLACE_CNTRSVR ) || defined( INPLACE_MDICNTR )
LPOLEINPLACEUIWINDOW ContainerDoc_GetTopInPlaceDoc(
LPCONTAINERDOC lpContainerDoc
);
void ContainerDoc_RemoveDocLevelTools(LPCONTAINERDOC lpContainerDoc);
void ContainerDoc_AddDocLevelTools(LPCONTAINERDOC lpContainerDoc);
#endif // INPLACE_CNTRSVR || INPLACE_MDICNTR
#endif // INPLACE_CNTR
/* ContainerDoc::IOleUILinkContainer methods (functions) */
STDMETHODIMP CntrDoc_LinkCont_QueryInterface(
LPOLEUILINKCONTAINER lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) CntrDoc_LinkCont_AddRef(LPOLEUILINKCONTAINER lpThis);
STDMETHODIMP_(ULONG) CntrDoc_LinkCont_Release(LPOLEUILINKCONTAINER lpThis);
STDMETHODIMP_(DWORD) CntrDoc_LinkCont_GetNextLink(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink
);
STDMETHODIMP CntrDoc_LinkCont_SetLinkUpdateOptions(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink,
DWORD dwUpdateOpt
);
STDMETHODIMP CntrDoc_LinkCont_GetLinkUpdateOptions(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink,
DWORD FAR* dwUpdateOpt
);
STDMETHODIMP CntrDoc_LinkCont_SetLinkSource(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink,
LPSTR lpszDisplayName,
ULONG clenFileName,
ULONG FAR* lpchEaten,
BOOL fValidateSource
);
STDMETHODIMP CntrDoc_LinkCont_GetLinkSource(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink,
LPSTR FAR* lplpszDisplayName,
ULONG FAR* lplenFileName,
LPSTR FAR* lplpszFullLinkType,
LPSTR FAR* lplpszShortLinkType,
BOOL FAR* lpfSourceAvailable,
BOOL FAR* lpfIsSelected
);
STDMETHODIMP CntrDoc_LinkCont_OpenLinkSource(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink
);
STDMETHODIMP CntrDoc_LinkCont_UpdateLink(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink,
BOOL fErrorMessage,
BOOL fErrorAction
);
STDMETHODIMP CntrDoc_LinkCont_CancelLink(
LPOLEUILINKCONTAINER lpThis,
DWORD dwLink
);
/*************************************************************************
** class CONTAINERAPP : OLEAPP
** CONTAINERAPP is an extention to the base OLEAPP object (structure)
** that adds special Container functionality. There is one instance of
** CONTAINERApp object created per running application instance. This
** object holds many fields that could otherwise be organized as
** global variables. The CONTAINERAPP class inherits all fields
** from the OLEAPP class. This inheritance is achieved by including a
** member variable of type OLEAPP as the first field in the CONTAINERAPP
** structure. OLEAPP inherits from OUTLINEAPP. This inheritance is
** achieved in the same manner. Thus a pointer to a CONTAINERAPP object
** can be cast to be a pointer to an OLEAPP or an OUTLINEAPP object
*************************************************************************/
/* Forward definition of types */
typedef struct tagCONTAINERAPP FAR* LPCONTAINERAPP;
typedef struct tagCONTAINERAPP {
OLEAPP m_OleApp; // ContainerApp inherits all fields of OleApp
UINT m_cfCntrOutl; // clipboard format for CntrOutl (client ver) data
int m_nSingleObjGetFmts; // no. formats avail when single obj copied
FORMATETC m_arrSingleObjGetFmts[MAXNOFMTS];
// array of FormatEtc's available via
// IDataObject::GetData when a single
// OLE object is copied.
#if defined( INPLACE_CNTR )
HACCEL m_hAccelIPCntr; // accelerators for container's workspace commands
HMENU m_hMenuFile; // handle to File menu of container app
HMENU m_hMenuView; // handle to View menu of container app
HMENU m_hMenuDebug; // handle to Debug menu of container app
LPOLEINPLACEACTIVEOBJECT m_lpIPActiveObj; // ptr to inplace active OLE obj
HWND m_hWndUIActiveObj; // HWND of UIActive obj.
BOOL m_fPendingUIDeactivate; // should app UIDeactivate on LBUTTONUP
BOOL m_fMustResizeClientArea;// if client area resize pending
// (see Doc_FrameWindowResized)
BOOL m_fMenuHelpMode;// is F1 pressed in menu, if so give help
#ifdef _DEBUG
BOOL m_fOutSideIn;
#endif
struct COleInPlaceFrameImpl {
IOleInPlaceFrameVtbl FAR* lpVtbl;
LPCONTAINERAPP lpContainerApp;
int cRef; // interface specific ref count.
} m_OleInPlaceFrame;
#endif // INPLACE_CNTR
} CONTAINERAPP;
/* ContainerApp methods (functions) */
BOOL ContainerApp_InitInstance(
LPCONTAINERAPP lpContainerApp,
HINSTANCE hInst,
int nCmdShow
);
BOOL ContainerApp_InitVtbls(LPCONTAINERAPP lpApp);
#if defined( INPLACE_CNTR )
/* ContainerApp::IOleInPlaceFrame methods (functions) */
STDMETHODIMP CntrApp_IPFrame_QueryInterface(
LPOLEINPLACEFRAME lpThis,
REFIID riid,
LPVOID FAR* lplpvObj
);
STDMETHODIMP_(ULONG) CntrApp_IPFrame_AddRef(LPOLEINPLACEFRAME lpThis);
STDMETHODIMP_(ULONG) CntrApp_IPFrame_Release(LPOLEINPLACEFRAME lpThis);
STDMETHODIMP CntrApp_IPFrame_GetWindow(
LPOLEINPLACEFRAME lpThis,
HWND FAR* lphwnd
);
STDMETHODIMP CntrApp_IPFrame_ContextSensitiveHelp(
LPOLEINPLACEFRAME lpThis,
BOOL fEnterMode
);
STDMETHODIMP CntrApp_IPFrame_GetBorder(
LPOLEINPLACEFRAME lpThis,
LPRECT lprectBorder
);
STDMETHODIMP CntrApp_IPFrame_RequestBorderSpace(
LPOLEINPLACEFRAME lpThis,
LPCBORDERWIDTHS lpWidths
);
STDMETHODIMP CntrApp_IPFrame_SetBorderSpace(
LPOLEINPLACEFRAME lpThis,
LPCBORDERWIDTHS lpWidths
);
STDMETHODIMP CntrApp_IPFrame_SetActiveObject(
LPOLEINPLACEFRAME lpThis,
LPOLEINPLACEACTIVEOBJECT lpActiveObject,
LPCOLESTR lpszObjName
);
STDMETHODIMP CntrApp_IPFrame_InsertMenus(
LPOLEINPLACEFRAME lpThis,
HMENU hmenu,
LPOLEMENUGROUPWIDTHS lpMenuWidths
);
STDMETHODIMP CntrApp_IPFrame_SetMenu(
LPOLEINPLACEFRAME lpThis,
HMENU hmenuShared,
HOLEMENU holemenu,
HWND hwndActiveObject
);
STDMETHODIMP CntrApp_IPFrame_RemoveMenus(
LPOLEINPLACEFRAME lpThis,
HMENU hmenu
);
STDMETHODIMP CntrApp_IPFrame_SetStatusText(
LPOLEINPLACEFRAME lpThis,
LPCOLESTR lpszStatusText
);
STDMETHODIMP CntrApp_IPFrame_EnableModeless(
LPOLEINPLACEFRAME lpThis,
BOOL fEnable
);
STDMETHODIMP CntrApp_IPFrame_TranslateAccelerator(
LPOLEINPLACEFRAME lpThis,
LPMSG lpmsg,
WORD wID
);
#endif // INPLACE_CNTR
#endif // _CNTROUTL_H_