#ifndef pack2cpp_h__ #define pack2cpp_h__ #include #ifdef __cplusplus #undef DebugMsg #define DebugMsg TraceMsg //////////////////////////////// // CPackage Definition // class CPackage : public IEnumOLEVERB, public IOleCommandTarget, public IOleObject, public IViewObject2, public IDataObject, public IPersistStorage, public IAdviseSink, public IRunnableObject, public IPersistFile, public IOleCache, public IExternalConnection // cleanup -- inherit interfaces { public: CPackage(); // constructor ~CPackage(); // destructor HRESULT Init(); // used to initialze fields that could fail BOOL RunWizard(); // IUnknown methods... STDMETHODIMP QueryInterface(REFIID,void **); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IEnumOLEVERB methods... STDMETHODIMP Next(ULONG celt, OLEVERB* rgVerbs, ULONG* pceltFetched); STDMETHODIMP Skip(ULONG celt); STDMETHODIMP Reset(); STDMETHODIMP Clone(IEnumOLEVERB** ppEnum); // IOleCommandTarget methods STDMETHODIMP QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText); STDMETHODIMP Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG* pvaIn, VARIANTARG* pvaOut); // IPersistStorage Methods... STDMETHODIMP GetClassID(LPCLSID pClassID); STDMETHODIMP IsDirty(void); STDMETHODIMP InitNew(IStorage* pstg); STDMETHODIMP Load(IStorage* pstg); STDMETHODIMP Save(IStorage* pstg, BOOL fSameAsLoad); STDMETHODIMP SaveCompleted(IStorage* pstg); STDMETHODIMP HandsOffStorage(void); // IPersistFile Methods... // STDMETHODIMP GetClassID(LPCLSID pClassID); // STDMETHODIMP IsDirty(void); STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwdMode); STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember); STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName); STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName); // IDataObject Methods... STDMETHODIMP GetData(LPFORMATETC pFEIn, LPSTGMEDIUM pSTM); STDMETHODIMP GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSTM); STDMETHODIMP QueryGetData(LPFORMATETC pFE); STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC pFEIn, LPFORMATETC pFEOut); STDMETHODIMP SetData(LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL fRelease); STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC *ppEnum); STDMETHODIMP DAdvise(LPFORMATETC pFE, DWORD grfAdv, LPADVISESINK pAdvSink, DWORD *pdwConnection); STDMETHODIMP DUnadvise(DWORD dwConnection); STDMETHODIMP EnumDAdvise(LPENUMSTATDATA *ppEnum); // IOleObject Methods... STDMETHODIMP SetClientSite(LPOLECLIENTSITE pClientSite); STDMETHODIMP GetClientSite(LPOLECLIENTSITE *ppClientSite); STDMETHODIMP SetHostNames(LPCOLESTR szContainerApp, LPCOLESTR szContainerObj); STDMETHODIMP Close(DWORD dwSaveOption); STDMETHODIMP SetMoniker(DWORD dwWhichMoniker, LPMONIKER pmk); STDMETHODIMP GetMoniker(DWORD dwAssign, DWORD dwWhichMonkier,LPMONIKER *ppmk); STDMETHODIMP InitFromData(LPDATAOBJECT pDataObject, BOOL fCreation, DWORD dwReserved); STDMETHODIMP GetClipboardData(DWORD dwReserved, LPDATAOBJECT *ppDataObject); STDMETHODIMP DoVerb(LONG iVerb, LPMSG lpmsg, LPOLECLIENTSITE pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect); STDMETHODIMP EnumVerbs(LPENUMOLEVERB *ppEnumOleVerb); STDMETHODIMP Update(void); STDMETHODIMP IsUpToDate(void); STDMETHODIMP GetUserClassID(LPCLSID pClsid); STDMETHODIMP GetUserType(DWORD dwFromOfType, LPOLESTR *pszUserType); STDMETHODIMP SetExtent(DWORD dwDrawAspect, LPSIZEL psizel); STDMETHODIMP GetExtent(DWORD dwDrawAspect, LPSIZEL psizel); STDMETHODIMP Advise(LPADVISESINK pAdvSink, DWORD *pdwConnection); STDMETHODIMP Unadvise(DWORD dwConnection); STDMETHODIMP EnumAdvise(LPENUMSTATDATA *ppenumAdvise); STDMETHODIMP GetMiscStatus(DWORD dwAspect, DWORD *pdwStatus); STDMETHODIMP SetColorScheme(LPLOGPALETTE pLogpal); // IViewObject2 Methods... STDMETHODIMP Draw(DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL (CALLBACK *pfnContinue)(ULONG_PTR), ULONG_PTR dwContinue); STDMETHODIMP GetColorSet(DWORD dwAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, LPLOGPALETTE *ppColorSet); STDMETHODIMP Freeze(DWORD dwDrawAspect, LONG lindex, void * pvAspect, DWORD *pdwFreeze); STDMETHODIMP Unfreeze(DWORD dwFreeze); STDMETHODIMP SetAdvise(DWORD dwAspects, DWORD dwAdvf, LPADVISESINK pAdvSink); STDMETHODIMP GetAdvise(DWORD *pdwAspects, DWORD *pdwAdvf, LPADVISESINK *ppAdvSink); STDMETHODIMP GetExtent(DWORD dwAspect, LONG lindex, DVTARGETDEVICE *ptd, LPSIZEL pszl); // IAdviseSink Methods... STDMETHODIMP_(void) OnDataChange(LPFORMATETC, LPSTGMEDIUM); STDMETHODIMP_(void) OnViewChange(DWORD, LONG); STDMETHODIMP_(void) OnRename(LPMONIKER); STDMETHODIMP_(void) OnSave(void); STDMETHODIMP_(void) OnClose(void); // IRunnable Object methods... STDMETHODIMP GetRunningClass(LPCLSID); STDMETHODIMP Run(LPBC); STDMETHODIMP_(BOOL) IsRunning(); STDMETHODIMP LockRunning(BOOL,BOOL); STDMETHODIMP SetContainedObject(BOOL); // IOleCache methods // We need an IOLECache Interface to Keep Office97 happy. STDMETHODIMP Cache(FORMATETC * pFormatetc, DWORD advf, DWORD * pdwConnection); STDMETHODIMP Uncache(DWORD dwConnection); STDMETHODIMP EnumCache(IEnumSTATDATA ** ppenumSTATDATA); STDMETHODIMP InitCache(IDataObject *pDataObject); // IExternalConnection // Some applications RealeaseConnect and then we never hear from them again. // This allows us to call OnClose() after the activations. STDMETHODIMP_(DWORD) AddConnection(DWORD exconn, DWORD dwreserved ); STDMETHODIMP_(DWORD) ReleaseConnection(DWORD extconn, DWORD dwreserved, BOOL fLastReleaseCloses ); protected: LONG _cRef; // package reference count UINT _cf; // package clipboard format LPIC _lpic; // icon for the packaged object PANETYPE _panetype; // tells us whether we have a cmdlink or embed PSSTATE _psState; // persistent storage state // These are mutually exclusive, so should probably be made into a union, // but that's a minor point. LPEMBED _pEmbed; // embedded file structure LPCML _pCml; // command line structure BOOL _fLoaded; // true if data from persistent storage // IOleObject vars from SetHostNames LPOLESTR _lpszContainerApp; LPOLESTR _lpszContainerObj; BOOL _fIsDirty; // dirty flag for our internal storage from the pov of our container DWORD _dwCookie; // connection value for AdviseSink // Advise interfaces LPDATAADVISEHOLDER _pIDataAdviseHolder; LPOLEADVISEHOLDER _pIOleAdviseHolder; LPOLECLIENTSITE _pIOleClientSite; // Excel hack: when Excel hosts what it thinks is a link it always NULLs out // it's "object" pointer. If we call anything on IOleClientSite other than // save then it will fault. BOOL _fNoIOleClientSiteCalls; BOOL _fFrozen; // to be able to send view change notifications we need these vars IAdviseSink *_pViewSink; DWORD _dwViewAspects; DWORD _dwViewAdvf; // IEnumOLEVERB variables: ULONG _cVerbs; ULONG _nCurVerb; OLEVERB* _pVerbs; IContextMenu* _pcm; // IEnumOLEVERB helper methods: HRESULT InitVerbEnum(OLEVERB* pVerbs, ULONG cVerbs); HRESULT GetContextMenu(IContextMenu** ppcm); VOID ReleaseContextMenu(); // if fInitFile is TRUE, then we will totally initialize ourselves // from the given filename. In other words, all our structures will be // initialized after calling this is fInitFile = TRUE. On the other hand, // if it's FALSE, then we'll just reinit our data and not update icon // and filename information. // HRESULT EmbedInitFromFile(LPCTSTR lpFileName, BOOL fInitFile); HRESULT CmlInitFromFile(LPTSTR lpFilename, BOOL fUpdateIcon, PANETYPE paneType); HRESULT InitFromPackInfo(LPPACKAGER_INFO lppi); HRESULT CreateTempFile(bool deleteExisting = false); HRESULT CreateTempFileName(); HRESULT _IconRefresh(); void _DestroyIC(); BOOL _IconCalcSize(LPIC lpic); VOID _IconDraw(LPIC,HDC, LPRECT); LPIC _IconCreateFromFile(LPCTSTR lpstrFile); VOID _GetCurrentIcon(LPIC lpic); void _CreateSaferIconTitle(LPTSTR szSaferTitle, LPCTSTR szIconTitle); void _DrawIconToDC(HDC hdcMF, LPIC lpic, bool stripAlpha, LPCTSTR pszActualFileName); // Data Transfer functions... HRESULT GetFileDescriptor(LPFORMATETC pFE, LPSTGMEDIUM pSTM); HRESULT GetFileContents(LPFORMATETC pFE, LPSTGMEDIUM pSTM); HRESULT GetMetafilePict(LPFORMATETC pFE, LPSTGMEDIUM pSTM); HRESULT GetEnhMetafile(LPFORMATETC pFE, LPSTGMEDIUM pSTM); HRESULT GetObjectDescriptor(LPFORMATETC pFE, LPSTGMEDIUM pSTM) ; HRESULT CreateShortcutOnStream(IStream* pstm); // Packager Read/Write Functions... HRESULT PackageReadFromStream(IStream* pstm); HRESULT IconReadFromStream(IStream* pstm); HRESULT EmbedReadFromStream(IStream* pstm); HRESULT CmlReadFromStream(IStream* pstm); HRESULT PackageWriteToStream(IStream* pstm); HRESULT IconWriteToStream(IStream* pstm, DWORD *pdw); HRESULT EmbedWriteToStream(IStream* pstm, DWORD *pdw); HRESULT CmlWriteToStream(IStream* pstm, DWORD *pdw); // Some utility functions and data void _FixupTempFile(IPersistFile * ppf, LPEMBED pEmbed); int _GiveWarningMsg(); // Misc AppCompat Stuff int _iPropertiesMenuItem; BOOL _bClosed; // the close happened BOOL _bCloseIt; // that we should close at the end of the activate }; //////////////////////////////////////////// // // Package Wizard and Edit Package Dialog Procs and functions // // Pages for Wizard INT_PTR APIENTRY PackWiz_CreatePackageDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY PackWiz_SelectFileDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY PackWiz_SelectLabelDlgProc(HWND, UINT, WPARAM, LPARAM); // Edit dialog procs INT_PTR APIENTRY PackWiz_EditEmbedPackageDlgProc(HWND, UINT, WPARAM, LPARAM); INT_PTR APIENTRY PackWiz_EditCmdPackakgeDlgProc(HWND, UINT, WPARAM, LPARAM); // functions int PackWiz_CreateWizard(HWND,LPPACKAGER_INFO); int PackWiz_EditPackage(HWND,int,LPPACKAGER_INFO); VOID PackWiz_FillInPropertyPage(PROPSHEETPAGE *, INT, DLGPROC); #endif // __cplusplus #endif