/*************************************************************************** * DSOFDOCOBJ.H * * DSOFramer: OLE DocObject Site component (used by the control) * * Copyright ©1999-2004; Microsoft Corporation. All rights reserved. * Written by Microsoft Developer Support Office Integration (PSS DSOI) * * This code is provided via KB 311765 as a sample. It is not a formal * product and has not been tested with all containers or servers. Use it * for educational purposes only. See the EULA.TXT file included in the * KB download for full terms of use and restrictions. * * THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. * ***************************************************************************/ #ifndef DS_DSOFDOCOBJ_H #define DS_DSOFDOCOBJ_H //////////////////////////////////////////////////////////////////// // Declarations for Interfaces used in DocObject Containment // #include // Standard DocObjects (common to all AxDocs) #include "ipprevw.h" // PrintPreview (for select Office apps) #include "rbbinder.h" // Internet Publishing (for Web Folder write access) //////////////////////////////////////////////////////////////////////// // Microsoft Office 97-2003 Document Object GUIDs // DEFINE_GUID(CLSID_WORD_DOCUMENT_DOC, 0x00020906, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLS, 0x00020820, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_EXCEL_CHART_XLS, 0x00020821, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_PPT_PRESENTATION_PPT, 0x64818D10, 0x4F9B, 0x11CF, 0x86, 0xEA, 0x00, 0xAA, 0x00, 0xB9, 0x29, 0xE8); DEFINE_GUID(CLSID_VISIO_DRAWING_VSD, 0x00021A13, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_PROJECT_DOCUMENT_MPP, 0x74B78F3A, 0xC8C8, 0x11D1, 0xBE, 0x11, 0x00, 0xC0, 0x4F, 0xB6, 0xFA, 0xF1); DEFINE_GUID(CLSID_MSHTML_DOCUMENT, 0x25336920, 0x03F9, 0x11CF, 0x8F, 0xD0, 0x00, 0xAA, 0x00, 0x68, 0x6F, 0x13); //////////////////////////////////////////////////////////////////////// // Microsoft Office 2007 Document GUIDs // DEFINE_GUID(CLSID_WORD_DOCUMENT_DOCX, 0xF4754C9B, 0x64F5, 0x4B40, 0x8A, 0xF4, 0x67, 0x97, 0x32, 0xAC, 0x06, 0x07); DEFINE_GUID(CLSID_WORD_DOCUMENT_DOCM, 0x18A06B6B, 0x2F3F, 0x4E2B, 0xA6, 0x11, 0x52, 0xBE, 0x63, 0x1B, 0x2D, 0x22); DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLSX, 0x00020830, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLSM, 0x00020832, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_EXCEL_WORKBOOK_XLSB, 0x00020833, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); DEFINE_GUID(CLSID_PPT_PRESENTATION_PPTX, 0xCF4F55F4, 0x8F87, 0x4D47, 0x80, 0xBB, 0x58, 0x08, 0x16, 0x4B, 0xB3, 0xF8); DEFINE_GUID(CLSID_PPT_PRESENTATION_PPTM, 0xDC020317, 0xE6E2, 0x4A62, 0xB9, 0xFA, 0xB3, 0xEF, 0xE1, 0x66, 0x26, 0xF4); //////////////////////////////////////////////////////////////////// // IDsoDocObjectSite -- {444CA1F7-B405-4002-95C3-A455BC9F4F55} // // Implemented by control host for callbacks. Required interface. // interface IDsoDocObjectSite : public IServiceProvider { STDMETHOD(GetWindow)(HWND* phWnd) PURE; STDMETHOD(GetBorder)(LPRECT prcBorder) PURE; STDMETHOD(SetStatusText)(LPCOLESTR pszText) PURE; STDMETHOD(GetHostName)(LPWSTR *ppwszHostName) PURE; STDMETHOD(SysMenuCommand)(UINT uiCharCode) PURE; }; DEFINE_GUID(IID_IDsoDocObjectSite, 0x444CA1F7, 0xB405, 0x4002, 0x95, 0xC3, 0xA4, 0x55, 0xBC, 0x9F, 0x4F, 0x55); //////////////////////////////////////////////////////////////////// // CDsoDocObject -- ActiveDocument Container Site Object // // The CDsoDocObject object handles all the DocObject embedding for the // control and os fairly self-contained. Like the control it has its // own window, but it merely acts as a parent for the embedded object // window(s) which it activates. // // CDsoDocObject works by taking a file (or automation object) and // copying out the OLE storage used for its persistent data. It then // creates a new embedding based on the data. If a storage is not // avaiable, it will attempt to oad the file directly, but the results // are less predictable using this manner since DocObjects are embeddings // and not links and this component has limited support for links. As a // result, we will attempt to keep our own storage copy in most cases. // // You should note that this approach is different than one taken by the // web browser control, which is basically a link container which will // try to embed (ip activate) if allowed, but if not it opens the file // externally and keeps the link. If CDsoDocObject cannot embed the object, // it returns an error. It will not open the object external. // // Like the control, this object also uses nested classes for the OLE // interfaces used in the embedding. They are easier to track and easier // to debug if a specific interface is over/under released. Again this was // a design decision to make the sample easier to break apart, but not required. // // Because the object is not tied to the top-level window, it constructs // the OLE merged menu as a set of popup menus which the control then displays // in whatever form it wants. You would need to customize this if you used // the control in a host and wanted the menus to merge with the actual host // menu bar (on the top-level window or form). // class CDsoDocObject : public IUnknown { public: CDsoDocObject(); ~CDsoDocObject(); // Static Create Method (Host Provides Site Interface) static STDMETHODIMP_(CDsoDocObject*) CreateInstance(IDsoDocObjectSite* phost); // IUnknown Implementation STDMETHODIMP QueryInterface(REFIID riid, void** ppv); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IOleClientSite Implementation BEGIN_INTERFACE_PART(OleClientSite, IOleClientSite) STDMETHODIMP SaveObject(void); STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk); STDMETHODIMP GetContainer(IOleContainer** ppContainer); STDMETHODIMP ShowObject(void); STDMETHODIMP OnShowWindow(BOOL fShow); STDMETHODIMP RequestNewObjectLayout(void); END_INTERFACE_PART(OleClientSite) // IOleInPlaceSite Implementation BEGIN_INTERFACE_PART(OleInPlaceSite, IOleInPlaceSite) STDMETHODIMP GetWindow(HWND* phwnd); STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode); STDMETHODIMP CanInPlaceActivate(void); STDMETHODIMP OnInPlaceActivate(void); STDMETHODIMP OnUIActivate(void); STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo); STDMETHODIMP Scroll(SIZE sz); STDMETHODIMP OnUIDeactivate(BOOL fUndoable); STDMETHODIMP OnInPlaceDeactivate(void); STDMETHODIMP DiscardUndoState(void); STDMETHODIMP DeactivateAndUndo(void); STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect); END_INTERFACE_PART(OleInPlaceSite) // IOleDocumentSite Implementation BEGIN_INTERFACE_PART(OleDocumentSite, IOleDocumentSite) STDMETHODIMP ActivateMe(IOleDocumentView* pView); END_INTERFACE_PART(OleDocumentSite) // IOleInPlaceFrame Implementation BEGIN_INTERFACE_PART(OleInPlaceFrame, IOleInPlaceFrame) STDMETHODIMP GetWindow(HWND* phWnd); STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode); STDMETHODIMP GetBorder(LPRECT prcBorder); STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS pBW); STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS pBW); STDMETHODIMP SetActiveObject(LPOLEINPLACEACTIVEOBJECT pIIPActiveObj, LPCOLESTR pszObj); STDMETHODIMP InsertMenus(HMENU hMenu, LPOLEMENUGROUPWIDTHS pMGW); STDMETHODIMP SetMenu(HMENU hMenu, HOLEMENU hOLEMenu, HWND hWndObj); STDMETHODIMP RemoveMenus(HMENU hMenu); STDMETHODIMP SetStatusText(LPCOLESTR pszText); STDMETHODIMP EnableModeless(BOOL fEnable); STDMETHODIMP TranslateAccelerator(LPMSG pMSG, WORD wID); END_INTERFACE_PART(OleInPlaceFrame) // IOleCommandTarget Implementation BEGIN_INTERFACE_PART(OleCommandTarget , IOleCommandTarget) STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText); STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvaIn, VARIANTARG *pvaOut); END_INTERFACE_PART(OleCommandTarget) // IServiceProvider Implementation BEGIN_INTERFACE_PART(ServiceProvider , IServiceProvider) STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv); END_INTERFACE_PART(ServiceProvider) // IAuthenticate Implementation BEGIN_INTERFACE_PART(Authenticate , IAuthenticate) STDMETHODIMP Authenticate(HWND *phwnd, LPWSTR *pszUsername, LPWSTR *pszPassword); END_INTERFACE_PART(Authenticate) // IContinueCallback Implementation BEGIN_INTERFACE_PART(ContinueCallback , IContinueCallback) STDMETHODIMP FContinue(void); STDMETHODIMP FContinuePrinting(LONG cPagesPrinted, LONG nCurrentPage, LPOLESTR pwszPrintStatus); END_INTERFACE_PART(ContinueCallback) // IOlePreviewCallback Implementation BEGIN_INTERFACE_PART(PreviewCallback , IOlePreviewCallback) STDMETHODIMP Notify(DWORD wStatus, LONG nLastPage, LPOLESTR pwszPreviewStatus); END_INTERFACE_PART(PreviewCallback) // DocObject Class Methods IDsoDocObjectSite STDMETHODIMP InitializeNewInstance(IDsoDocObjectSite* phost); STDMETHODIMP CreateDocObject(REFCLSID rclsid); STDMETHODIMP CreateDocObject(IStorage *pstg); STDMETHODIMP CreateFromFile(LPWSTR pwszFile, REFCLSID rclsid, LPBIND_OPTS pbndopts); STDMETHODIMP CreateFromURL(LPWSTR pwszUrlFile, REFCLSID rclsid, LPBIND_OPTS pbndopts, LPWSTR pwszUserName, LPWSTR pwszPassword); STDMETHODIMP CreateFromRunningObject(LPUNKNOWN punkObj, LPWSTR pwszObjectName, LPBIND_OPTS pbndopts); STDMETHODIMP IPActivateView(); STDMETHODIMP IPDeactivateView(); STDMETHODIMP UIActivateView(); STDMETHODIMP UIDeactivateView(); STDMETHODIMP_(BOOL) IsDirty(); STDMETHODIMP Save(); STDMETHODIMP SaveToFile(LPWSTR pwszFile, BOOL fOverwriteFile); STDMETHODIMP SaveToURL(LPWSTR pwszURL, BOOL fOverwriteFile, LPWSTR pwszUserName, LPWSTR pwszPassword); STDMETHODIMP PrintDocument(LPCWSTR pwszPrinter, LPCWSTR pwszOutput, UINT cCopies, UINT nFrom, UINT nTo, BOOL fPromptUser); STDMETHODIMP StartPrintPreview(); STDMETHODIMP ExitPrintPreview(BOOL fForceExit); STDMETHODIMP DoOleCommand(DWORD dwOleCmdId, DWORD dwOptions, VARIANT* vInParam, VARIANT* vInOutParam); STDMETHODIMP Close(); // Control should notify us on these conditions (so we can pass to IP object)... STDMETHODIMP_(void) OnNotifySizeChange(LPRECT prc); STDMETHODIMP_(void) OnNotifyAppActivate(BOOL fActive, DWORD dwThreadID); STDMETHODIMP_(void) OnNotifyPaletteChanged(HWND hwndPalChg); STDMETHODIMP_(void) OnNotifyChangeToolState(BOOL fShowTools); STDMETHODIMP_(void) OnNotifyControlFocus(BOOL fGotFocus); STDMETHODIMP HrGetDataFromObject(VARIANT *pvtType, VARIANT *pvtOutput); STDMETHODIMP HrSetDataInObject(VARIANT *pvtType, VARIANT *pvtInput, BOOL fMbcsString); STDMETHODIMP_(BOOL) GetDocumentTypeAndFileExtension(WCHAR** ppwszFileType, WCHAR** ppwszFileExt); // Inline accessors for control to get IP object info... inline IOleInPlaceActiveObject* GetActiveObject(){return m_pipactive;} inline IOleObject* GetOleObject(){return m_pole;} inline HWND GetDocWindow(){return m_hwnd;} inline HWND GetActiveWindow(){return m_hwndUIActiveObj;} inline BOOL IsReadOnly(){return m_fOpenReadOnly;} inline BOOL InPrintPreview(){return ((m_pprtprv != NULL) || (m_fInPptSlideShow));} inline HWND GetMenuHWND(){return m_hwndMenuObj;} inline HMENU GetActiveMenu(){return m_hMenuActive;} inline HMENU GetMergedMenu(){return m_hMenuMerged;} inline void SetMergedMenu(HMENU h){m_hMenuMerged = h;} inline LPCWSTR GetSourceName(){return ((m_pwszWebResource) ? m_pwszWebResource : m_pwszSourceFile);} inline LPCWSTR GetSourceDocName(){return ((m_pwszSourceFile) ? &m_pwszSourceFile[m_idxSourceName] : NULL);} inline CLSID* GetServerCLSID(){return &m_clsidObject;} inline BOOL IsIPActive(){return (m_pipobj != NULL);} BOOL IsWordObject() {return ((m_clsidObject == CLSID_WORD_DOCUMENT_DOC) || (m_clsidObject == CLSID_WORD_DOCUMENT_DOCX) || (m_clsidObject == CLSID_WORD_DOCUMENT_DOCM)); } BOOL IsExcelObject() {return ((m_clsidObject == CLSID_EXCEL_WORKBOOK_XLS) || (m_clsidObject == CLSID_EXCEL_WORKBOOK_XLSX) || (m_clsidObject == CLSID_EXCEL_WORKBOOK_XLSM) || (m_clsidObject == CLSID_EXCEL_WORKBOOK_XLSB) || (m_clsidObject == CLSID_EXCEL_CHART_XLS)); } BOOL IsPPTObject() {return ((m_clsidObject == CLSID_PPT_PRESENTATION_PPT) || (m_clsidObject == CLSID_PPT_PRESENTATION_PPTX) || (m_clsidObject == CLSID_PPT_PRESENTATION_PPTM)); } BOOL IsVisioObject() {return (m_clsidObject == CLSID_VISIO_DRAWING_VSD);} STDMETHODIMP SetRunningServerLock(BOOL fLock); protected: // Internal helper methods... STDMETHODIMP InstantiateDocObjectServer(REFCLSID rclsid, IOleObject **ppole); STDMETHODIMP CreateObjectStorage(REFCLSID rclsid); STDMETHODIMP SaveObjectStorage(); STDMETHODIMP SaveDocToMoniker(IMoniker *pmk, IBindCtx *pbc, BOOL fKeepLock); STDMETHODIMP SaveDocToFile(LPWSTR pwszFullName, BOOL fKeepLock); STDMETHODIMP ValidateDocObjectServer(REFCLSID rclsid); STDMETHODIMP_(BOOL) ValidateFileExtension(WCHAR* pwszFile, WCHAR** ppwszOut); STDMETHODIMP_(void) OnDraw(DWORD dvAspect, HDC hdcDraw, LPRECT prcBounds, LPRECT prcWBounds, HDC hicTargetDev, BOOL fOptimize); STDMETHODIMP EnsureOleServerRunning(BOOL fLockRunning); STDMETHODIMP_(void) FreeRunningLock(); STDMETHODIMP_(void) TurnOffWebToolbar(BOOL fTurnedOff); STDMETHODIMP_(void) ClearMergedMenu(); STDMETHODIMP_(DWORD) CalcDocNameIndex(LPCWSTR pwszPath); STDMETHODIMP_(void) CheckForPPTPreviewChange(); // These functions allow the component to access files in a Web Folder for // write access using the Microsoft Provider for Internet Publishing (MSDAIPP), // which is installed by Office and comes standard in Windows 2000/ME/XP/2003. The // provider is not required to use the component, only if you wish to save to // an FPSE or DAV Web Folder (URL). STDMETHODIMP_(IUnknown*) CreateIPPBindResource(); STDMETHODIMP IPPDownloadWebResource(LPWSTR pwszURL, LPWSTR pwszFile, IStream** ppstmKeepForSave); STDMETHODIMP IPPUploadWebResource(LPWSTR pwszFile, IStream** ppstmSave, LPWSTR pwszURLSaveTo, BOOL fOverwriteFile); static STDMETHODIMP_(LRESULT) FrameWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); // The private class variables... private: ULONG m_cRef; // Reference count HWND m_hwnd; // our window HWND m_hwndCtl; // The control's window RECT m_rcViewRect; // Viewable area (set by host) IDsoDocObjectSite *m_psiteCtl; // The control's site interface IOleCommandTarget *m_pcmdCtl; // IOCT of host (for frame msgs) LPWSTR m_pwszHostName; // Ole Host Name for container LPWSTR m_pwszSourceFile; // Path to Source File (on Open) IMoniker *m_pmkSourceFile; // Moniker to original source file IBindCtx *m_pbctxSourceFile; // Bind context used to original source file IStorage *m_pstgSourceFile; // Original File Storage (if open/save file) DWORD m_idxSourceName; // Index to doc name in m_pwszSourceFile CLSID m_clsidObject; // CLSID of the embedded object IStorage *m_pstgroot; // Root temp storage IStorage *m_pstgfile; // In-memory file storage IStream *m_pstmview; // In-memory view info stream LPWSTR m_pwszWebResource; // The full URL to the web resource IStream *m_pstmWebResource; // Original Download Stream (if open/save URL) IUnknown *m_punkIPPResource; // MSDAIPP provider resource (for URL authoring) LPWSTR m_pwszUsername; // Username and password used by MSDAIPP LPWSTR m_pwszPassword; // for Authentication (see IAuthenticate) IOleObject *m_pole; // Embedded OLE Object (OLE) IOleInPlaceObject *m_pipobj; // The IP object methods (OLE) IOleInPlaceActiveObject *m_pipactive; // The UI Active object methods (OLE) IOleDocumentView *m_pdocv; // MSO Document View (DocObj) IOleCommandTarget *m_pcmdt; // MSO Command Target (DocObj) IOleInplacePrintPreview *m_pprtprv; // MSO Print Preview (DocObj) HMENU m_hMenuActive; // The menu supplied by embedded object HMENU m_hMenuMerged; // The merged menu (set by control host) HOLEMENU m_holeMenu; // The OLE Menu Descriptor HWND m_hwndMenuObj; // The window for menu commands HWND m_hwndIPObject; // IP active object window HWND m_hwndUIActiveObj; // UI Active object window DWORD m_dwObjectThreadID; // Thread Id of UI server BORDERWIDTHS m_bwToolSpace; // Toolspace... // Bitflags (state info)... unsigned int m_fDisplayTools:1; unsigned int m_fDisconnectOnQuit:1; unsigned int m_fAppWindowActive:1; unsigned int m_fOpenReadOnly:1; unsigned int m_fObjectInModalCondition:1; unsigned int m_fObjectIPActive:1; unsigned int m_fObjectUIActive:1; unsigned int m_fObjectActivateComplete:1; unsigned int m_fLockedServerRunning:1; unsigned int m_fLoadedFromAuto:1; unsigned int m_fInClose:1; unsigned int m_fAttemptPptPreview:1; unsigned int m_fInPptSlideShow:1; }; #endif //DS_DSOFDOCOBJ_H