mirror of https://github.com/lianthony/NT4.0
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.
319 lines
10 KiB
319 lines
10 KiB
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1995 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Foundation Classes Reference and related
|
|
// electronic documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Microsoft Foundation Classes product.
|
|
|
|
// Note: Must include AFXOLE.H first
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA AFX_OLE_DATA
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COleFrameHook - AFX_INTERNAL
|
|
|
|
class COleFrameHook : public CCmdTarget
|
|
{
|
|
// Construction & Destruction
|
|
public:
|
|
COleFrameHook(CFrameWnd* pFrameWnd, COleClientItem* pItem);
|
|
|
|
// Implementation
|
|
public:
|
|
~COleFrameHook();
|
|
|
|
CFrameWnd* m_pFrameWnd;
|
|
LPOLEINPLACEACTIVEOBJECT m_lpActiveObject;
|
|
COleClientItem* m_pActiveItem; // item this COleFrameHook is for
|
|
HWND m_hWnd; // actual HWND this hook is attached to
|
|
BOOL m_bInModalState; // TRUE if EnableModeless(FALSE) has been called
|
|
BOOL m_bToolBarHidden; // TRUE if toolbar needs to be shown OnUIDeactivate
|
|
HACCEL m_hAccelTable; // accelerator to be used while in-place object active
|
|
UINT m_nModelessCount; // !0 if server's EnableModeless has been called
|
|
CString m_strObjName; // name of the active in-place object
|
|
|
|
// Overrides for implementation
|
|
public:
|
|
virtual void OnRecalcLayout(); // for border space re-negotiation
|
|
virtual BOOL OnPreTranslateMessage(MSG* pMsg);
|
|
virtual void OnActivate(BOOL bActive); // for OnFrameWindowActivate
|
|
virtual BOOL OnDocActivate(BOOL bActive); // for OnDocWindowActivate
|
|
virtual BOOL OnContextHelp(BOOL bEnter);
|
|
virtual void OnEnableModeless(BOOL bEnable);
|
|
virtual BOOL OnUpdateFrameTitle();
|
|
virtual void OnPaletteChanged(CWnd* pFocusWnd);
|
|
virtual BOOL OnQueryNewPalette();
|
|
|
|
// implementation helpers
|
|
BOOL NotifyAllInPlace(
|
|
BOOL bParam, BOOL (COleFrameHook::*pNotifyFunc)(BOOL bParam));
|
|
BOOL DoContextSensitiveHelp(BOOL bEnter);
|
|
BOOL DoEnableModeless(BOOL bEnable);
|
|
|
|
// Interface Maps
|
|
public:
|
|
BEGIN_INTERFACE_PART(OleInPlaceFrame, IOleInPlaceFrame)
|
|
INIT_INTERFACE_PART(COleFrameHook, OleInPlaceFrame)
|
|
STDMETHOD(GetWindow)(HWND*);
|
|
STDMETHOD(ContextSensitiveHelp)(BOOL);
|
|
STDMETHOD(GetBorder)(LPRECT);
|
|
STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS);
|
|
STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS);
|
|
STDMETHOD(SetActiveObject)(LPOLEINPLACEACTIVEOBJECT, LPCOLESTR);
|
|
STDMETHOD(InsertMenus)(HMENU, LPOLEMENUGROUPWIDTHS);
|
|
STDMETHOD(SetMenu)(HMENU, HOLEMENU, HWND);
|
|
STDMETHOD(RemoveMenus)(HMENU);
|
|
STDMETHOD(SetStatusText)(LPCOLESTR);
|
|
STDMETHOD(EnableModeless)(BOOL);
|
|
STDMETHOD(TranslateAccelerator)(LPMSG, WORD);
|
|
END_INTERFACE_PART(OleInPlaceFrame)
|
|
|
|
DECLARE_INTERFACE_MAP()
|
|
|
|
friend COleClientItem;
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Type library cache - AFX_INTERNAL
|
|
|
|
class CTypeLibCache
|
|
{
|
|
public:
|
|
CTypeLibCache(const GUID* ptlid);
|
|
~CTypeLibCache();
|
|
|
|
void Lock();
|
|
virtual void Unlock();
|
|
BOOL Lookup(LCID lcid, LPTYPELIB* pptlib);
|
|
void Cache(LCID lcid, LPTYPELIB ptlib);
|
|
BOOL LookupTypeInfo(LCID lcid, REFGUID guid, LPTYPEINFO* pptinfo);
|
|
void CacheTypeInfo(LCID lcid, REFGUID guid, LPTYPEINFO ptinfo);
|
|
|
|
protected:
|
|
const GUID* m_ptlid;
|
|
LCID m_lcid;
|
|
LPTYPELIB m_ptlib;
|
|
GUID m_guidInfo;
|
|
LPTYPEINFO m_ptinfo;
|
|
long m_cRef;
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Helper for implementing OLE enumerators
|
|
|
|
// Note: the following interface is not an actual OLE interface, but is useful
|
|
// for describing an abstract (not typesafe) enumerator.
|
|
|
|
#undef INTERFACE
|
|
#define INTERFACE IEnumVOID
|
|
|
|
DECLARE_INTERFACE_(IEnumVOID, IUnknown)
|
|
{
|
|
STDMETHOD(QueryInterface)(REFIID, LPVOID*) PURE;
|
|
STDMETHOD_(ULONG,AddRef)() PURE;
|
|
STDMETHOD_(ULONG,Release)() PURE;
|
|
STDMETHOD(Next)(ULONG, void*, ULONG*) PURE;
|
|
STDMETHOD(Skip)(ULONG) PURE;
|
|
STDMETHOD(Reset)() PURE;
|
|
STDMETHOD(Clone)(IEnumVOID**) PURE;
|
|
};
|
|
|
|
class CEnumArray : public CCmdTarget
|
|
{
|
|
// Constructors
|
|
public:
|
|
CEnumArray(size_t nSize,
|
|
const void* pvEnum, UINT nCount, BOOL bNeedFree = FALSE);
|
|
|
|
// Implementation
|
|
public:
|
|
virtual ~CEnumArray();
|
|
|
|
protected:
|
|
size_t m_nSizeElem; // size of each item in the array
|
|
CCmdTarget* m_pClonedFrom; // used to keep original alive for clones
|
|
|
|
BYTE* m_pvEnum; // pointer data to enumerate
|
|
UINT m_nCurPos; // current position in m_pvEnum
|
|
UINT m_nSize; // total number of items in m_pvEnum
|
|
BOOL m_bNeedFree; // free on release?
|
|
|
|
virtual BOOL OnNext(void* pv);
|
|
virtual BOOL OnSkip();
|
|
virtual void OnReset();
|
|
virtual CEnumArray* OnClone();
|
|
|
|
// Interface Maps
|
|
public:
|
|
BEGIN_INTERFACE_PART(EnumVOID, IEnumVOID)
|
|
INIT_INTERFACE_PART(CEnumArray, EnumVOID)
|
|
STDMETHOD(Next)(ULONG, void*, ULONG*);
|
|
STDMETHOD(Skip)(ULONG);
|
|
STDMETHOD(Reset)();
|
|
STDMETHOD(Clone)(IEnumVOID**);
|
|
END_INTERFACE_PART(EnumVOID)
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COleDispatchImpl - IDispatch implementation
|
|
|
|
// Note: This class is only designed to be used as a CCmdTarget member
|
|
// (at the offset specified by CCmdTarget::m_xDispatch))
|
|
// It WILL NOT work in other classes or at different offsets!
|
|
|
|
class COleDispatchImpl : public IDispatch
|
|
{
|
|
public:
|
|
#ifndef _AFX_NO_NESTED_DERIVATION
|
|
// required for METHOD_PROLOGUE_EX
|
|
size_t m_nOffset;
|
|
COleDispatchImpl::COleDispatchImpl()
|
|
{ m_nOffset = offsetof(CCmdTarget, m_xDispatch); }
|
|
#endif
|
|
|
|
STDMETHOD_(ULONG, AddRef)();
|
|
STDMETHOD_(ULONG, Release)();
|
|
STDMETHOD(QueryInterface)(REFIID, LPVOID*);
|
|
|
|
STDMETHOD(GetTypeInfoCount)(UINT*);
|
|
STDMETHOD(GetTypeInfo)(UINT, LCID, LPTYPEINFO*);
|
|
STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, UINT, LCID, DISPID*);
|
|
STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*, LPVARIANT,
|
|
LPEXCEPINFO, UINT*);
|
|
|
|
// special method for disconnect
|
|
virtual void Disconnect();
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// OLE data (like AUX_DATA)
|
|
|
|
struct OLE_DATA
|
|
{
|
|
// OLE 1.0 clipboard formats
|
|
UINT cfNative, cfOwnerLink, cfObjectLink;
|
|
|
|
// OLE 2.0 clipboard formats
|
|
UINT cfEmbeddedObject, cfEmbedSource, cfLinkSource;
|
|
UINT cfObjectDescriptor, cfLinkSourceDescriptor;
|
|
UINT cfFileName, cfFileNameW;
|
|
|
|
//RichEdit formats
|
|
UINT cfRichTextFormat;
|
|
UINT cfRichTextAndObjects;
|
|
|
|
OLE_DATA();
|
|
};
|
|
|
|
extern OLE_DATA _oleData;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// _AFX_OLE_STATE
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA
|
|
|
|
class _AFX_OLE_STATE : public CNoTrackObject
|
|
{
|
|
public:
|
|
_AFX_OLE_STATE();
|
|
virtual ~_AFX_OLE_STATE();
|
|
|
|
BOOL m_bNeedTerm;
|
|
|
|
CView* m_pActivateView; // activation view
|
|
COleDataSource* m_pClipboardSource;
|
|
|
|
DWORD m_dwReserved; // was "parking space" window
|
|
CMapPtrToPtr m_mapExtraData; // Extra data for OLE controls.
|
|
#ifdef _AFXDLL
|
|
HINSTANCE m_hInstOLE; // handle of OLE32.DLL
|
|
HINSTANCE m_hInstOLEAUT; // handle of OLEAUT32.DLL
|
|
HINSTANCE m_hInstOLEDLG; // handle of OLEDLG.DLL
|
|
#ifdef _MAC
|
|
HINSTANCE m_hInstWLMOLE; // handle of WLM OLE layer
|
|
#endif
|
|
#endif
|
|
long m_nReserved; // was reference count on parking window
|
|
};
|
|
|
|
EXTERN_PROCESS_LOCAL(_AFX_OLE_STATE, _afxOleState)
|
|
|
|
#define AfxGetExtraDataMap() (&_afxOleState.GetData()->m_mapExtraData)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global helper functions
|
|
|
|
// menu merging/unmerging
|
|
void AFXAPI AfxMergeMenus(CMenu* pMenuShared, CMenu* pMenuSource,
|
|
LONG* lpMenuWidths, int iWidthIndex);
|
|
void AFXAPI AfxUnmergeMenus(CMenu* pMenuShared, CMenu* pMenuSource);
|
|
|
|
// helpers for exceptions
|
|
void AFXAPI _AfxFillOleFileException(CFileException*, SCODE sc);
|
|
void AFXAPI _AfxThrowOleFileException(SCODE sc);
|
|
|
|
// helper used during object creation
|
|
LPFORMATETC AFXAPI _AfxFillFormatEtc(LPFORMATETC lpFormatEtc,
|
|
CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtcFill);
|
|
|
|
// helper to copy clipboard data
|
|
BOOL AFXAPI _AfxCopyStgMedium(
|
|
CLIPFORMAT cfFormat, LPSTGMEDIUM lpDest, LPSTGMEDIUM lpSource);
|
|
|
|
// helper for reliable and small Release calls
|
|
DWORD AFXAPI _AfxRelease(LPUNKNOWN* plpUnknown);
|
|
#ifndef _DEBUG
|
|
// generate smaller code in release build
|
|
#define RELEASE(lpUnk) _AfxRelease((LPUNKNOWN*)&lpUnk)
|
|
#else
|
|
// generate larger but typesafe code in debug build
|
|
#define RELEASE(lpUnk) do \
|
|
{ if ((lpUnk) != NULL) { (lpUnk)->Release(); (lpUnk) = NULL; } } while (0)
|
|
#endif
|
|
|
|
// helpers from OLESTD.C (from original OLE2UI sample)
|
|
HGLOBAL AFXAPI _AfxOleGetObjectDescriptorData(CLSID clsid, DWORD dwDrawAspect,
|
|
SIZEL sizel, POINTL pointl, DWORD dwStatus, LPCOLESTR lpszFullUserTypeName,
|
|
LPCOLESTR lpszSrcOfCopy);
|
|
HGLOBAL AFXAPI _AfxOleGetObjectDescriptorData(LPOLEOBJECT lpOleObj,
|
|
LPCOLESTR lpszSrcOfCopy, DWORD dwDrawAspect, POINTL pointl, LPSIZEL lpSizelHim);
|
|
SCODE AFXAPI _AfxOleDoConvert(LPSTORAGE lpStg, REFCLSID rClsidNew);
|
|
SCODE AFXAPI _AfxOleDoTreatAsClass(
|
|
LPCTSTR lpszUserType, REFCLSID rclsid, REFCLSID rclsidNew);
|
|
DVTARGETDEVICE* AFXAPI _AfxOleCreateTargetDevice(LPPRINTDLG lpPrintDlg);
|
|
DVTARGETDEVICE* AFXAPI _AfxOleCreateTargetDevice(LPDEVNAMES pDN, LPDEVMODE pDM);
|
|
UINT AFXAPI _AfxOleGetUserTypeOfClass(
|
|
REFCLSID rclsid, LPTSTR lpszUserType, UINT cch, HKEY hKey);
|
|
DWORD AFXAPI _AfxOleGetLenFilePrefixOfMoniker(LPMONIKER lpmk);
|
|
DVTARGETDEVICE* AFXAPI _AfxOleCopyTargetDevice(DVTARGETDEVICE* ptdSrc);
|
|
void AFXAPI _AfxOleCopyFormatEtc(LPFORMATETC petcDest, LPFORMATETC petcSrc);
|
|
HDC AFXAPI _AfxOleCreateDC(DVTARGETDEVICE* ptd);
|
|
void AFXAPI _AfxDeleteMetafilePict(HGLOBAL hMetaPict);
|
|
BOOL AFXAPI _AfxOlePropertiesEnabled();
|
|
|
|
// helper(s) for reliable and small QueryInterface calls
|
|
LPUNKNOWN AFXAPI _AfxQueryInterface(LPUNKNOWN lpUnknown, REFIID riid);
|
|
#define QUERYINTERFACE(lpUnknown, iface) \
|
|
(iface*)_AfxQueryInterface(lpUnknown, IID_##iface)
|
|
|
|
// helpers for conversion between himetric and pixels
|
|
#define HIMETRIC_PER_INCH 2540
|
|
#define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli))
|
|
#define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// implementation types and constants
|
|
|
|
#define OLE_MAXITEMNAME (_countof("Embedding ")+_countof("4294967295")-_countof(""))
|
|
|
|
typedef LPVOID* LPLP;
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|