如何将MFC ActiveX控件标记为安全

在**Ctrl.cpp中增加如下函数

 HRESULT   CreateComponentCategory(CATID   catid,   WCHAR*   catDescription)    
 {    
    
 ICatRegister*   pcr   =   NULL   ;    
 HRESULT   hr   =   S_OK   ;    
    
 hr   =   CoCreateInstance(CLSID_StdComponentCategoriesMgr,    
 NULL,   CLSCTX_INPROC_SERVER,   IID_ICatRegister,   (void**)&pcr);    
 if   (FAILED(hr))    
 return   hr;    
    
 //   Make   sure   the   HKCR/Component   Categories/{..catid...}    
 //   key   is   registered    
 CATEGORYINFO   catinfo;    
 catinfo.catid   =   catid;    
 catinfo.lcid   =   0x0409   ;   //   english    
    
 //   Make   sure   the   provided   description   is   not   too   long.    
 //   Only   copy   the   first   127   characters   if   it   is    
 int   len   =   wcslen(catDescription);    
 if   (len>127)    
 len   =   127;    
 wcsncpy(catinfo.szDescription,   catDescription,   len);    
 //   Make   sure   the   description   is   null   terminated    
 catinfo.szDescription[len]   =   '/0';    
    
 hr   =   pcr->RegisterCategories(1,   &catinfo);    
 pcr->Release();    
    
 return   hr;    
 }    
    
    
 HRESULT   RegisterCLSIDInCategory(REFCLSID   clsid,   CATID   catid)    
{    
 //   Register   your   component   categories   information.    
 ICatRegister*   pcr   =   NULL   ;    
 HRESULT   hr   =   S_OK   ;    
 hr   =   CoCreateInstance(CLSID_StdComponentCategoriesMgr,    
 NULL,   CLSCTX_INPROC_SERVER,   IID_ICatRegister,   (void**)&pcr);    
 if   (SUCCEEDED(hr))    
 {    
 //   Register   this   category   as   being   "implemented"   by    
 //   the   class.    
 CATID   rgcatid[1]   ;    
 rgcatid[0]   =   catid;    
 hr   =   pcr->RegisterClassImplCategories(clsid,   1,   rgcatid);    
 }    
    
 if   (pcr   !=   NULL)    
 pcr->Release();    
    
 return   hr;    
 }    
    
HRESULT   UnRegisterCLSIDInCategory(REFCLSID   clsid,   CATID   catid)    
{    
 ICatRegister*   pcr   =   NULL   ;    
 HRESULT   hr   =   S_OK   ;    
 hr   =   CoCreateInstance(CLSID_StdComponentCategoriesMgr,    
 NULL,   CLSCTX_INPROC_SERVER,   IID_ICatRegister,   (void**)&pcr);    
 if   (SUCCEEDED(hr))    
 {    
 //   Unregister   this   category   as   being   "implemented"   by    
 //   the   class.    
 CATID   rgcatid[1]   ;    
 rgcatid[0]   =   catid;    
 hr   =   pcr->UnRegisterClassImplCategories(clsid,   1,   rgcatid);    
 }    
    
 if   (pcr   !=   NULL)    
 pcr->Release();    
    
 return   hr;    
 } 

 

修改UpdateRegistry函数


BOOL testOCXCtrl::testOCXCtrlFactory::UpdateRegistry(BOOL bRegister)
{
 // TODO: 验证您的控件是否符合单元模型线程处理规则。
 // 有关更多信息,请参考 MFC 技术说明 64。
 // 如果您的控件不符合单元模型规则,则
 // 必须修改如下代码,将第六个参数从
 // afxRegApartmentThreading 改为 0。

 /*if (bRegister)
  return AfxOleRegisterControlClass(
   AfxGetInstanceHandle(),
   m_clsid,
   m_lpszProgID,
   IDS_SIPXTOCX,
   IDB_SIPXTOCX,
   afxRegApartmentThreading,
   _dwsipXtOCXOleMisc,
   _tlid,
   _wVerMajor,
   _wVerMinor);
 else
  return AfxOleUnregisterClass(m_clsid, m_lpszProgID);*/
 if   (bRegister)    
 {    
 HRESULT   hr   =   S_OK   ;    
    
 //   register   as   safe   for   scripting    
 hr   =   CreateComponentCategory(CATID_SafeForScripting,    
 L"Controls   that   are   safely   scriptable");
 if(FAILED(hr))
  return   FALSE;
 hr = RegisterCLSIDInCategory(m_clsid,   CATID_SafeForScripting);   
 if(FAILED(hr))
  return   FALSE;
 //   register   as   safe   for   initializing    
 hr =CreateComponentCategory(CATID_SafeForInitializing,    
 L"Controls   safely   initializable   from   persistent   data");       
 if(FAILED(hr))
  return   FALSE;
    
 hr   =   RegisterCLSIDInCategory(m_clsid,   CATID_SafeForInitializing);    
    
 if   (FAILED(hr))    
      return   FALSE;    
 return   AfxOleRegisterControlClass(    
 AfxGetInstanceHandle(),    
 m_clsid,    
 m_lpszProgID,    
 IDS_SIPXTOCX,    
 IDB_SIPXTOCX,    
 afxRegInsertable   |   afxRegApartmentThreading,    
 _dwsipXtOCXOleMisc,    
 _tlid,    
 _wVerMajor,    
 _wVerMinor);    
 }    
 else    
 {    
 HRESULT hr =   S_OK   ;    
    
 hr=UnRegisterCLSIDInCategory(m_clsid,CATID_SafeForScripting);    
    
 if(FAILED(hr))    
  return   FALSE;    
    
 hr=UnRegisterCLSIDInCategory(m_clsid,   CATID_SafeForInitializing);    
    
 if(FAILED(hr))    
 return   FALSE;    
    
 return   AfxOleUnregisterClass(m_clsid,   m_lpszProgID);    
  }
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值