本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9722890
建立时间:2004年12月20日




[c++]IE去掉控件交互的提示 
原创空间,  软件技术,  电脑与网络

邢红瑞 发表于 2005/11/8 10:46:26

关于证书的问题,不再本文章的范畴之内。其实这是很简单的事情,只要注册表加入类似的就可以 HKEY_CLASSES_ROOT\Component   Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}    HKEY_CLASSES_ROOT\Component   Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}    HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented   Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}    HKEY_CLASSES_ROOT\CLSID\{"your controls GUID"}\Implemented   Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}    7DD95801-9882-11CF-9FA9-00AA006C42C4为安全空间的ID。如果是ATL的工程,很简单需要在控件中实现IObjectSafety接口,class CLoginCtl :     .... ,     public IObjectSafetyImpl<CLoginCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA> { ... BEGIN_COM_MAP(CLoginCtl) COM_INTERFACE_ENTRY(IObjectSafety) END_COM_MAP() ... } 或者BEGIN_CATEGORY_MAP(CLoginCtl) IMPLEMENTED_CATEGORY(CATID_SafeForInitializing) msdn http://support.microsoft.com/kb/168371/en-us mfc的ocx加入msdn的一段程序就行了。msdn http://support.microsoft.com/kb/161873/en-usconst CATID CLSID_SafeItem  ={0xa709093a, 0x22f9, 0x4bea,{0xa5, 0xfb, 0x12, 0x24, 0xf2, 0x83, 0xff, 0xbb}}; const GUID CDECL BASED_CODE _tlid ={ 0xde14b7a, 0xd4e2, 0x4a9e, { 0x91, 0xa9, 0x32, 0x7b, 0x14, 0x9b, 0xf9, 0x5f } };const WORD _wVerMajor = 1;const WORD _wVerMinor = 0; //   创建组件种类     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;   }   /////////////////////////////////////////////////////////////////////////////   //   DllRegisterServer   -   Adds   entries   to   the   system   registry   STDAPI   DllRegisterServer(void)   {    HRESULT   hr;        AFX_MANAGE_STATE(_afxModuleAddrThis);        if   (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(),   _tlid))     return   ResultFromScode(SELFREG_E_TYPELIB);        if   (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))     return   ResultFromScode(SELFREG_E_CLASS);        //   标记控件初始化安全.    //   创建初始化安全组件种类    hr   =   CreateComponentCategory(CATID_SafeForInitializing,   L"Controls   safely   initializable   from   persistent   data!");    if   (FAILED(hr))     return   hr;    //   注册初始化安全    hr   =   RegisterCLSIDInCategory(CLSID_SafeItem,   CATID_SafeForInitializing);    if   (FAILED(hr))     return   hr;        //   标记控件脚本安全    //   创建脚本安全组件种类      hr   =   CreateComponentCategory(CATID_SafeForScripting,   L"Controls   safely   scriptable!");    if   (FAILED(hr))     return   hr;    //   注册脚本安全组件种类    hr   =   RegisterCLSIDInCategory(CLSID_SafeItem,   CATID_SafeForScripting);    if   (FAILED(hr))     return   hr;        return   NOERROR;   }   /////////////////////////////////////////////////////////////////////////////   //   DllUnregisterServer   -   Removes   entries   from   the   system   registry   STDAPI   DllUnregisterServer(void)   {    HRESULT   hr;        AFX_MANAGE_STATE(_afxModuleAddrThis);        if   (!AfxOleUnregisterTypeLib(_tlid,   _wVerMajor,   _wVerMinor))     return   ResultFromScode(SELFREG_E_TYPELIB);        if   (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))     return   ResultFromScode(SELFREG_E_CLASS);        //   删除控件初始化安全入口.    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,   CATID_SafeForInitializing);    if   (FAILED(hr))     return   hr;    //   删除控件脚本安全入口    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,   CATID_SafeForScripting);    if   (FAILED(hr))     return   hr;        //////////////////////////    return   NOERROR;   }      但是msdn写错了, 它犯了一个逻辑错误,当用regsvr32 /u 进行反注册时,将弹出  错误提示:调用某某ocx文件的DllUnregisterServer函数出错,提示:系统找不到指定的文件。    看看注册表,其实反注册是成功的。   安全组件其实是在注册表中添加一些注册,表明自己安全罢了,关于安全性的注册是依赖与原组件的,所以上面函数反注册的顺序不正确,应该先反注册掉安全组件,再  反注册掉原组件,修改后的代码如下:  STDAPI   DllUnregisterServer(void)   {    HRESULT   hr;        AFX_MANAGE_STATE(_afxModuleAddrThis);    //   删除控件初始化安全入口.    hr=UnRegisterCLSIDInCategory(CLSID_SafeItem,   CATID_SafeForInitializing);    if(SUCCEEDED(hr))  {  //   删除控件脚本安全入口        hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);    } if(!AfxOleUnregisterTypeLib(_tlid,   _wVerMajor,   _wVerMinor))     return   ResultFromScode(SELFREG_E_TYPELIB);        if(!COleObjectFactoryEx::UpdateRegistryAll(FALSE))     return   ResultFromScode(SELFREG_E_CLASS);     return  hr;   } 


阅读全文(3379) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 1.349 second(s), page refreshed 144804841 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号