#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;
}