使ActiveX控件安全代码

翻译|其它|编辑:郝浩|2007-12-06 10:41:57.000|阅读 1475 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

按照代码的注释要求修添加程序代码就可以避免上述的问题了。我的所有控件都是用该代码段,没有问题。  
   
  /****************    
  //   在 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);  
  }  


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:CSDN

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP