使ActiveX控件安全代码

按照代码的注释要求修添加程序代码就可以避免上述的问题了。我的所有控件都是用该代码段,没有问题。  
   
  /****************    
  //   在ActiveX的类声明文件XXXCtrl.h的头部中添加如下代码  
  #include   <objsafe.h>  
   
  //   在ActiveX的类声明文件C..Ctrl.h的类声明内部添加如下代码  
  //   接口映射  
  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);  
  ***********************************************   *******************/  
   
  /**********************  
  //   在ActiveX的类实现文件XXXCtrl.cpp中添加如下代码,并将CXXXCtrl更换为你的ActiveX的类名称  
  //   IObjectSafety的接口映射  
  BEGIN_INTERFACE_MAP(   CXXXCtrl,   COleControl   )  
  INTERFACE_PART(CXXXCtrl,   IID_IObjectSafety,   ObjSafe)  
  END_INTERFACE_MAP()  
   
   
    /  
  //   IObjectSafety   成员函数  
  //   AddRef,   Release,   QueryInterface  
  ULONG   FAR   EXPORT   CXXXCtrl::XObjSafe::AddRef()  
  {  
  METHOD_PROLOGUE(CXXXCtrl,   ObjSafe)  
  return   pThis->ExternalAddRef();  
  }  
   
  ULONG   FAR   EXPORT   CXXXCtrl::XObjSafe::Release()  
  {  
  METHOD_PROLOGUE(CXXXCtrl,   ObjSafe)  
  return   pThis->ExternalRelease();  
  }  
   
  HRESULT   FAR   EXPORT   CXXXCtrl::XObjSafe::QueryInterface(  
  REFIID   iid,   void   FAR*   FAR*   ppvObj)  
  {  
  METHOD_PROLOGUE(CXXXCtrl,   ObjSafe)  
  return   (HRESULT)pThis->ExternalQueryInterface(&iid,   ppvObj);  
  }  
   
  const   DWORD   dwSupportedBits   =    
  INTERFACESAFE_FOR_UNTRUSTED_CALLER   |  
  INTERFACESAFE_FOR_UNTRUSTED_DATA;  
  const   DWORD   dwNotSupportedBits   =   ~   dwSupportedBits;  
   
  ///   //  
  //   CXXXCtrl::XObjSafe::GetInterfaceSafetyOptions  
  HRESULT   STDMETHODCALLTYPE    
  CXXXCtrl::XObjSafe::GetInterfaceSafetyOptions(  
  REFIID   riid,    
  DWORD   __RPC_FAR   *pdwSupportedOptions,    
  DWORD   __RPC_FAR   *pdwEnabledOptions  
  )  
  {  
  METHOD_PROLOGUE(CXXXCtrl,   ObjSafe)  
   
  HRESULT   retval   =   ResultFromScode(S_OK);  
   
  //   接口是否存在  
  IUnknown   FAR*   punkInterface;  
  retval   =   pThis->ExternalQueryInterface(&riid,   (void   *   *)&punkInterface);  
  if   (retval   !=   E_NOINTERFACE)   //   接口存在  
  {  
  punkInterface->Release();   //   释放引用  
  }  
   
  //   We   support   both   kinds   of   safety   and   have   always   both   set,  
  //   regardless   of   interface.  
  *pdwSupportedOptions   =   *pdwEnabledOptions   =   dwSupportedBits;  
  return   retval;   //   E_NOINTERFACE   if   QI   failed  
  }  
   
    /  
  //   CXXXCtrl::XObjSafe::SetInterfaceSafetyOptions  
  HRESULT   STDMETHODCALLTYPE    
  CXXXCtrl::XObjSafe::SetInterfaceSafetyOptions(    
  REFIID   riid,  
  DWORD   dwOptionSetMask,  
  DWORD   dwEnabledOptions  
  )  
  {  
  METHOD_PROLOGUE(CXXXCtrl,   ObjSafe)  
   
  //   接口是否存在  
  IUnknown   FAR*   punkInterface;  
  pThis->ExternalQueryInterface(&riid,   (void   *   *)&punkInterface);  
  if   (punkInterface)   //   接口存在  
  {  
  punkInterface->Release();   //   释放引用  
  }  
  else   //   接口不存在  
  {    
  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);  
  }     
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值