浏览器插件---解决不添加信任站点就不能正常初始化的问题

来源:互联网 发布:php考试系统手机端 编辑:程序博客网 时间:2024/04/30 20:20

#include <StrSafe.h>
#include <objsafe.h>

static const CATID CLSID_SafeItem =
{ 0xa5c1039c, 0xe7b7, 0x442b, { 0xbf, 0x4b, 0xbf, 0xc2, 0x34, 0x2f, 0x12, 0x70 }};     //此ID同index.html里面写的ID

// HRESULT CreateComponentCategory – 用于注册安全的ActiveX控件
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;

 // 确认HKCR\Component Categories\{..catid...}键值被注册

 CATEGORYINFO catinfo;
 catinfo.catid = catid;
 catinfo.lcid = 0x0409 ; // english

 size_t len;
 // 确认描述不是太长。
 // 只复制开始的127个字符。
 // StringCchLength的第二个参数表示被读入catDescription的最大字符数。
 // 第三个参数表示字符串的长度

 //hr = StringCchLength((STRSAFE_LPSTR)catDescription, STRSAFE_MAX_CCH, &len);
 hr = StringCchLength((LPCTSTR)catDescription, STRSAFE_MAX_CCH, &len);
 if (SUCCEEDED(hr))
 {
  if (len>127)
  {
   len = 127;
  }
 }  
 else
 {
  // TODO: Write an error handler;

 }

 hr = StringCchCopy((LPTSTR)(catinfo.szDescription), len + 1, (LPCTSTR)catDescription);
 // 添加字符串结束符.
 catinfo.szDescription[len + 1] = '\0';

 hr = pcr->RegisterCategories(1, &catinfo);
 pcr->Release();

 return hr;
}

HRESULT RegisterCLSIDInCategory(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))
 {
  CATID rgcatid[1] ;
  rgcatid[0] = catid;
  hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
 }

 if (pcr != NULL)
  pcr->Release();

 return hr;
}

// HRESULT UnRegisterCLSIDInCategory
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))
 {
  CATID rgcatid[1] ;
  rgcatid[0] = catid;
  hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
 }

 if (pcr != NULL)
  pcr->Release();

 return hr;
}

// DllRegisterServer - 将项添加到系统注册表

STDAPI DllRegisterServer(void)
{
 AFX_MANAGE_STATE(_afxModuleAddrThis);

 if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
  return ResultFromScode(SELFREG_E_TYPELIB);

 if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
  return ResultFromScode(SELFREG_E_CLASS);

 // 为初始化标记控件为安全控件                                      
 if (FAILED(CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!")))
  return ResultFromScode(SELFREG_E_CLASS);

 if (FAILED(RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing)))
  return ResultFromScode(SELFREG_E_CLASS);

 // 为脚本标记控件为安全控件                                       
 if (FAILED(CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!")))
  return ResultFromScode(SELFREG_E_CLASS);

 if (FAILED(RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting)))
  return ResultFromScode(SELFREG_E_CLASS);
 return NOERROR;
}

 

// DllUnregisterServer - 将项从系统注册表中移除

STDAPI DllUnregisterServer(void)
{
 AFX_MANAGE_STATE(_afxModuleAddrThis);

 UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
 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 NOERROR;
}

 

0 0