?? afxdisp.h
字號:
#define VTS_PR4 "\x44" // a 'float*'
#define VTS_PR8 "\x45" // a 'double*'
#define VTS_PCY "\x46" // a 'CY*'
#define VTS_PDATE "\x47" // a 'DATE*'
#define VTS_PBSTR "\x48" // a 'BSTR*'
#define VTS_PDISPATCH "\x49" // an 'IDispatch**'
#define VTS_PSCODE "\x4A" // an 'SCODE*'
#define VTS_PBOOL "\x4B" // a 'VARIANT_BOOL*'
#define VTS_PVARIANT "\x4C" // a 'VARIANT*'
#define VTS_PUNKNOWN "\x4D" // an 'IUnknown**'
#define VTS_PUI1 "\x4F" // a 'BYTE*'
// special VT_ and VTS_ values
#define VTS_NONE NULL // used for members with 0 params
#define VT_MFCVALUE 0xFFF // special value for DISPID_VALUE
#define VT_MFCBYREF 0x40 // indicates VT_BYREF type
#define VT_MFCMARKER 0xFF // delimits named parameters (INTERNAL USE)
// variant handling (use V_BSTRT when you have ANSI BSTRs, as in DAO)
#ifndef _UNICODE
#define V_BSTRT(b) (LPSTR)V_BSTR(b)
#else
#define V_BSTRT(b) V_BSTR(b)
#endif
/////////////////////////////////////////////////////////////////////////////
// OLE control parameter types
#define VTS_COLOR VTS_I4 // OLE_COLOR
#define VTS_XPOS_PIXELS VTS_I4 // OLE_XPOS_PIXELS
#define VTS_YPOS_PIXELS VTS_I4 // OLE_YPOS_PIXELS
#define VTS_XSIZE_PIXELS VTS_I4 // OLE_XSIZE_PIXELS
#define VTS_YSIZE_PIXELS VTS_I4 // OLE_YSIZE_PIXELS
#define VTS_XPOS_HIMETRIC VTS_I4 // OLE_XPOS_HIMETRIC
#define VTS_YPOS_HIMETRIC VTS_I4 // OLE_YPOS_HIMETRIC
#define VTS_XSIZE_HIMETRIC VTS_I4 // OLE_XSIZE_HIMETRIC
#define VTS_YSIZE_HIMETRIC VTS_I4 // OLE_YSIZE_HIMETRIC
#define VTS_TRISTATE VTS_I2 // OLE_TRISTATE
#define VTS_OPTEXCLUSIVE VTS_BOOL // OLE_OPTEXCLUSIVE
#define VTS_PCOLOR VTS_PI4 // OLE_COLOR*
#define VTS_PXPOS_PIXELS VTS_PI4 // OLE_XPOS_PIXELS*
#define VTS_PYPOS_PIXELS VTS_PI4 // OLE_YPOS_PIXELS*
#define VTS_PXSIZE_PIXELS VTS_PI4 // OLE_XSIZE_PIXELS*
#define VTS_PYSIZE_PIXELS VTS_PI4 // OLE_YSIZE_PIXELS*
#define VTS_PXPOS_HIMETRIC VTS_PI4 // OLE_XPOS_HIMETRIC*
#define VTS_PYPOS_HIMETRIC VTS_PI4 // OLE_YPOS_HIMETRIC*
#define VTS_PXSIZE_HIMETRIC VTS_PI4 // OLE_XSIZE_HIMETRIC*
#define VTS_PYSIZE_HIMETRIC VTS_PI4 // OLE_YSIZE_HIMETRIC*
#define VTS_PTRISTATE VTS_PI2 // OLE_TRISTATE*
#define VTS_POPTEXCLUSIVE VTS_PBOOL // OLE_OPTEXCLUSIVE*
#define VTS_FONT VTS_DISPATCH // IFontDispatch*
#define VTS_PICTURE VTS_DISPATCH // IPictureDispatch*
#define VTS_HANDLE VTS_I4 // OLE_HANDLE
#define VTS_PHANDLE VTS_PI4 // OLE_HANDLE*
// these DISP_ macros cause the framework to generate the DISPID
#define DISP_FUNCTION(theClass, szExternalName, pfnMember, vtRetVal, vtsParams) \
{ _T(szExternalName), DISPID_UNKNOWN, vtsParams, vtRetVal, \
(AFX_PMSG)(void (theClass::*)(void))&pfnMember, (AFX_PMSG)0, 0, \
afxDispCustom }, \
#define DISP_PROPERTY(theClass, szExternalName, memberName, vtPropType) \
{ _T(szExternalName), DISPID_UNKNOWN, NULL, vtPropType, (AFX_PMSG)0, (AFX_PMSG)0, \
offsetof(theClass, memberName), afxDispCustom }, \
#define DISP_PROPERTY_NOTIFY(theClass, szExternalName, memberName, pfnAfterSet, vtPropType) \
{ _T(szExternalName), DISPID_UNKNOWN, NULL, vtPropType, (AFX_PMSG)0, \
(AFX_PMSG)(void (theClass::*)(void))&pfnAfterSet, \
offsetof(theClass, memberName), afxDispCustom }, \
#define DISP_PROPERTY_EX(theClass, szExternalName, pfnGet, pfnSet, vtPropType) \
{ _T(szExternalName), DISPID_UNKNOWN, NULL, vtPropType, \
(AFX_PMSG)(void (theClass::*)(void))&pfnGet, \
(AFX_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \
#define DISP_PROPERTY_PARAM(theClass, szExternalName, pfnGet, pfnSet, vtPropType, vtsParams) \
{ _T(szExternalName), DISPID_UNKNOWN, vtsParams, vtPropType, \
(AFX_PMSG)(void (theClass::*)(void))&pfnGet, \
(AFX_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \
// these DISP_ macros allow the app to determine the DISPID
#define DISP_FUNCTION_ID(theClass, szExternalName, dispid, pfnMember, vtRetVal, vtsParams) \
{ _T(szExternalName), dispid, vtsParams, vtRetVal, \
(AFX_PMSG)(void (theClass::*)(void))&pfnMember, (AFX_PMSG)0, 0, \
afxDispCustom }, \
#define DISP_PROPERTY_ID(theClass, szExternalName, dispid, memberName, vtPropType) \
{ _T(szExternalName), dispid, NULL, vtPropType, (AFX_PMSG)0, (AFX_PMSG)0, \
offsetof(theClass, memberName), afxDispCustom }, \
#define DISP_PROPERTY_NOTIFY_ID(theClass, szExternalName, dispid, memberName, pfnAfterSet, vtPropType) \
{ _T(szExternalName), dispid, NULL, vtPropType, (AFX_PMSG)0, \
(AFX_PMSG)(void (theClass::*)(void))&pfnAfterSet, \
offsetof(theClass, memberName), afxDispCustom }, \
#define DISP_PROPERTY_EX_ID(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType) \
{ _T(szExternalName), dispid, NULL, vtPropType, \
(AFX_PMSG)(void (theClass::*)(void))&pfnGet, \
(AFX_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \
#define DISP_PROPERTY_PARAM_ID(theClass, szExternalName, dispid, pfnGet, pfnSet, vtPropType, vtsParams) \
{ _T(szExternalName), dispid, vtsParams, vtPropType, \
(AFX_PMSG)(void (theClass::*)(void))&pfnGet, \
(AFX_PMSG)(void (theClass::*)(void))&pfnSet, 0, afxDispCustom }, \
// the DISP_DEFVALUE is a special case macro that creates an alias for DISPID_VALUE
#define DISP_DEFVALUE(theClass, szExternalName) \
{ _T(szExternalName), DISPID_UNKNOWN, NULL, VT_MFCVALUE, \
(AFX_PMSG)0, (AFX_PMSG)0, 0, afxDispCustom }, \
#define DISP_DEFVALUE_ID(theClass, dispid) \
{ NULL, dispid, NULL, VT_MFCVALUE, (AFX_PMSG)0, (AFX_PMSG)0, 0, \
afxDispCustom }, \
/////////////////////////////////////////////////////////////////////////////
// Macros for creating "creatable" automation classes.
#define DECLARE_OLECREATE(class_name) \
public: \
static AFX_DATA COleObjectFactory factory; \
static AFX_DATA const GUID guid; \
#define IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
AFX_DATADEF COleObjectFactory class_name::factory(class_name::guid, \
RUNTIME_CLASS(class_name), FALSE, _T(external_name)); \
AFX_COMDAT const AFX_DATADEF GUID class_name::guid = \
{ l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }; \
/////////////////////////////////////////////////////////////////////////////
// Helper class for driving IDispatch
class COleDispatchDriver
{
// Constructors
public:
COleDispatchDriver();
COleDispatchDriver(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
COleDispatchDriver(const COleDispatchDriver& dispatchSrc);
// Attributes
LPDISPATCH m_lpDispatch;
BOOL m_bAutoRelease;
// Operations
BOOL CreateDispatch(REFCLSID clsid, COleException* pError = NULL);
BOOL CreateDispatch(LPCTSTR lpszProgID, COleException* pError = NULL);
void AttachDispatch(LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);
LPDISPATCH DetachDispatch();
// detach and get ownership of m_lpDispatch
void ReleaseDispatch();
// helpers for IDispatch::Invoke
void AFX_CDECL InvokeHelper(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ...);
void AFX_CDECL SetProperty(DISPID dwDispID, VARTYPE vtProp, ...);
void GetProperty(DISPID dwDispID, VARTYPE vtProp, void* pvProp) const;
// special operators
operator LPDISPATCH();
const COleDispatchDriver& operator=(const COleDispatchDriver& dispatchSrc);
// Implementation
public:
~COleDispatchDriver();
void InvokeHelperV(DISPID dwDispID, WORD wFlags, VARTYPE vtRet,
void* pvRet, const BYTE* pbParamInfo, va_list argList);
};
/////////////////////////////////////////////////////////////////////////////
// Class Factory implementation (binds OLE class factory -> runtime class)
// (all specific class factories derive from this class factory)
class COleObjectFactory : public CCmdTarget
{
DECLARE_DYNAMIC(COleObjectFactory)
// Construction
public:
COleObjectFactory(REFCLSID clsid, CRuntimeClass* pRuntimeClass,
BOOL bMultiInstance, LPCTSTR lpszProgID);
// Attributes
virtual BOOL IsRegistered() const;
REFCLSID GetClassID() const;
// Operations
virtual BOOL Register();
BOOL Unregister();
void Revoke();
void UpdateRegistry(LPCTSTR lpszProgID = NULL);
// default uses m_lpszProgID if not NULL
BOOL IsLicenseValid();
static BOOL PASCAL UnregisterAll();
static BOOL PASCAL RegisterAll();
static void PASCAL RevokeAll();
static BOOL PASCAL UpdateRegistryAll(BOOL bRegister = TRUE);
// Overridables
protected:
virtual CCmdTarget* OnCreateObject();
virtual BOOL UpdateRegistry(BOOL bRegister);
virtual BOOL VerifyUserLicense();
virtual BOOL GetLicenseKey(DWORD dwReserved, BSTR* pbstrKey);
virtual BOOL VerifyLicenseKey(BSTR bstrKey);
// Implementation
public:
virtual ~COleObjectFactory();
#ifdef _DEBUG
void AssertValid() const;
void Dump(CDumpContext& dc) const;
#endif
public:
COleObjectFactory* m_pNextFactory; // list of factories maintained
protected:
DWORD m_dwRegister; // registry identifier
CLSID m_clsid; // registered class ID
CRuntimeClass* m_pRuntimeClass; // runtime class of CCmdTarget derivative
BOOL m_bMultiInstance; // multiple instance?
LPCTSTR m_lpszProgID; // human readable class ID
BYTE m_bLicenseChecked;
BYTE m_bLicenseValid;
BYTE m_bRegistered; // is currently registered w/ system
BYTE m_bOAT; // used by COleTemplateServer to
// remember application type for unregistry
// Interface Maps
public:
BEGIN_INTERFACE_PART(ClassFactory, IClassFactory2)
INIT_INTERFACE_PART(COleObjectFactory, ClassFactory)
STDMETHOD(CreateInstance)(LPUNKNOWN, REFIID, LPVOID*);
STDMETHOD(LockServer)(BOOL);
STDMETHOD(GetLicInfo)(LPLICINFO);
STDMETHOD(RequestLicKey)(DWORD, BSTR*);
STDMETHOD(CreateInstanceLic)(LPUNKNOWN, LPUNKNOWN, REFIID, BSTR,
LPVOID*);
END_INTERFACE_PART(ClassFactory)
DECLARE_INTERFACE_MAP()
friend SCODE AFXAPI AfxDllGetClassObject(REFCLSID, REFIID, LPVOID*);
friend SCODE STDAPICALLTYPE DllGetClassObject(REFCLSID, REFIID, LPVOID*);
};
// Define COleObjectFactoryEx for compatibility with old CDK
#define COleObjectFactoryEx COleObjectFactory
//////////////////////////////////////////////////////////////////////////////
// COleTemplateServer - COleObjectFactory using CDocTemplates
// This enumeration is used in AfxOleRegisterServerClass to pick the
// correct registration entries given the application type.
enum OLE_APPTYPE
{
OAT_UNKNOWN = -1, // no type decided yet
OAT_INPLACE_SERVER = 0, // server has full server user-interface
OAT_SERVER = 1, // server supports only embedding
OAT_CONTAINER = 2, // container supports links to embeddings
OAT_DISPATCH_OBJECT = 3, // IDispatch capable object
OAT_DOC_OBJECT_SERVER = 4, // sever supports DocObject embedding
OAT_DOC_OBJECT_CONTAINER =5,// container supports DocObject clients
};
class COleTemplateServer : public COleObjectFactory
{
// Constructors
public:
COleTemplateServer();
// Operations
void ConnectTemplate(REFCLSID clsid, CDocTemplate* pDocTemplate,
BOOL bMultiInstance);
// set doc template after creating it in InitInstance
void UpdateRegistry(OLE_APPTYPE nAppType = OAT_INPLACE_SERVER,
LPCTSTR* rglpszRegister = NULL, LPCTSTR* rglpszOverwrite = NULL);
// may want to UpdateRegistry if not run with /Embedded
BOOL Register();
BOOL Unregister();
// Implementation
protected:
virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo);
virtual CCmdTarget* OnCreateObject();
CDocTemplate* m_pDocTemplate;
private:
void UpdateRegistry(LPCTSTR lpszProgID);
// hide base class version of UpdateRegistry
};
/////////////////////////////////////////////////////////////////////////////
// System registry helpers
// Helper to register server in case of no .REG file loaded
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid, LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName, LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL, LPCTSTR* rglpszOverwrite = NULL,
int nIconIndex = 0, LPCTSTR lpszLocalFilterName = NULL);
BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid, LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName, LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType,
LPCTSTR* rglpszRegister, LPCTSTR* rglpszOverwrite,
int nIconIndex, LPCTSTR lpszLocalFilterName, LPCTSTR lpszLocalFilterExt);
BOOL AFXAPI AfxOleUnregisterServerClass(
REFCLSID clsid, LPCTSTR lpszClassName, LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName, OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL, LPCTSTR* rglpszOverwrite = NULL);
// AfxOleRegisterHelper is a worker function used by
// AfxOleRegisterServerClass (available for advanced registry work)
BOOL AFXAPI AfxOleRegisterHelper(LPCTSTR const* rglpszRegister,
LPCTSTR const* rglpszSymbols, int nSymbols, BOOL bReplace,
HKEY hKeyRoot = ((HKEY)0x80000000)); // HKEY_CLASSES_ROOT
BOOL AFXAPI AfxOleUnregisterHelper(LPCTSTR const* rglpszRegister,
LPCTSTR const* rglpszSymbols, int nSymbols,
HKEY hKeyRoot = ((HKEY)0x80000000)); // HKEY_CLASSES_ROOT
/////////////////////////////////////////////////////////////////////////////
// Connection maps
#define BEGIN_CONNECTION_PART(theClass, localClass) \
class X##localClass : public CConnectionPoint \
{ \
public: \
X##localClass() \
{ m_nOffset = offsetof(theClass, m_x##localClass); }
#define CONNECTION_IID(iid) \
REFIID GetIID() { return iid; }
#define END_CONNECTION_PART(localClass) \
} m_x##localClass; \
friend class X##localClass;
#ifdef _AFXDLL
#define BEGIN_CONNECTION_MAP(theClass, theBase) \
const AFX_CONNECTIONMAP* PASCAL theClass::_GetBaseConnectionMap() \
{ return &theBase::connectionMap; } \
const AFX_CONNECTIONMAP* theClass::GetConnectionMap() const \
{ return &theClass::connectionMap; } \
AFX_COMDAT const AFX_DATADEF AFX_CONNECTIONMAP theClass::connectionMap = \
{ &theClass::_GetBaseConnectionMap, &theClass::_connectionEntries[0], }; \
AFX_COMDAT const AFX_DATADEF AFX_CONNECTIONMAP_ENTRY theClass::_connectionEntries[] = \
{ \
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -