本文共 4753 字,大约阅读时间需要 15 分钟。
打开
工程名Ctl.h搜索class C工程名Ctrl : public COleControl在其上面添加#include <objsafe.h>搜索DECLARE_DYNCREATE(C工程名Ctrl)下面添加DECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) ( REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions ); STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) ( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions ); END_INTERFACE_PART(ObjSafe);打开工程名Ctl.cpp搜索BOOL C工程名Ctrl::C工程名CtrlFactory::UpdateRegistry(BOOL bRegister){ // TODO: Verify that your control follows apartment-model threading rules. // Refer to MFC TechNote 64 for more information. // If your control does not conform to the apartment-model rules, then // you must modify the code below, changing the 6th parameter from // afxRegApartmentThreading to 0.if (bRegister)
return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_工程名, //这里的工程名必须为大写 IDB_工程名, //这里的工程名必须为大写 afxRegApartmentThreading, _dwGetLocalOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID);}替换为/// Interface map for IObjectSafetyBEGIN_INTERFACE_MAP( C工程名Ctrl, COleControl )
INTERFACE_PART(C工程名Ctrl, IID_IObjectSafety, ObjSafe)END_INTERFACE_MAP()/
// IObjectSafety member functions// Delegate AddRef, Release, QueryInterface
ULONG FAR EXPORT C工程名Ctrl::XObjSafe::AddRef()
{ METHOD_PROLOGUE(C工程名Ctrl, ObjSafe) return pThis->ExternalAddRef();}ULONG FAR EXPORT C工程名Ctrl::XObjSafe::Release()
{ METHOD_PROLOGUE(C工程名Ctrl, ObjSafe) return pThis->ExternalRelease();}HRESULT FAR EXPORT C工程名Ctrl::XObjSafe::QueryInterface(
REFIID iid, void FAR* FAR* ppvObj){ METHOD_PROLOGUE(C工程名Ctrl, ObjSafe) return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);}const DWORD dwSupportedBits =
INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;const DWORD dwNotSupportedBits = ~ dwSupportedBits; /// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions// Allows container to query what interfaces are safe for what. We're// optimizing significantly by ignoring which interface the caller is// asking for.HRESULT STDMETHODCALLTYPE C工程名Ctrl::XObjSafe::GetInterfaceSafetyOptions( REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions){ METHOD_PROLOGUE(C工程名Ctrl, ObjSafe)HRESULT retval = ResultFromScode(S_OK);
// does interface exist?
IUnknown FAR* punkInterface; retval = pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface); if (retval != E_NOINTERFACE) { // interface exists punkInterface->Release(); // release it--just checking! } // we support both kinds of safety and have always both set, // regardless of interface *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;return retval; // E_NOINTERFACE if QI failed
}/
// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions// Since we're always safe, this is a no-brainer--but we do check to make// sure the interface requested exists and that the options we're asked to// set exist and are set on (we don't support unsafe mode).HRESULT STDMETHODCALLTYPE C工程名Ctrl::XObjSafe::SetInterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions){ METHOD_PROLOGUE(C工程名Ctrl, ObjSafe) // does interface exist? IUnknown FAR* punkInterface; pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface); if (punkInterface) { // interface exists punkInterface->Release(); // release it--just checking! } else { // interface doesn't exist return ResultFromScode(E_NOINTERFACE); }// can't set bits we don't support
if (dwOptionSetMask & dwNotSupportedBits) { return ResultFromScode(E_FAIL); } // can't set bits we do support to zero dwEnabledOptions &= dwSupportedBits; // (we already know there are no extra bits in mask ) if ((dwOptionSetMask & dwEnabledOptions) != dwOptionSetMask) { return ResultFromScode(E_FAIL); } // don't need to change anything since we're always safe return ResultFromScode(S_OK);}/// C工程名Ctrl::C工程名CtrlFactory::UpdateRegistry -// Adds or removes system registry entries for C工程名CtrlBOOL C工程名Ctrl::C工程名CtrlFactory::UpdateRegistry(BOOL bRegister)
{ // TODO: Verify that your control follows apartment-model threading rules. // Refer to MFC TechNote 64 for more information. // If your control does not conform to the apartment-model rules, then // you must modify the code below, changing the 6th parameter from // afxRegApartmentThreading to 0.if (bRegister)
return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_工程名, //这里的工程名为大写 IDB_工程名, //这里的工程名为大写 afxRegApartmentThreading, _dw工程名OleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID);} /// C工程名Ctrl::C工程名Ctrl - Constructor转载地址:http://irgdi.baihongyu.com/