vc++ activex ocx无需调整IE安全等级 解决未签名

一:添加三个全局函数


// Helper function to create a component category and associated description 
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; 
}

// Helper function to register a CLSID as belonging to a component category 
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; 
}  

// Helper function to unregister a CLSID as belonging to a component category 
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 bRegister)函数替换如下:

BOOL CLCCBatmanCtrl::CLCCBatmanCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegApartmentThreading to 0.

if (bRegister)
{
HRESULT hr = S_OK;
//register as Safe for Scripting
hr = CreateComponentCategory(CATID_SafeForScripting,
L"Controls that are safely scripting");
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 initializing form 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_LCCBATMAN,
IDB_LCCBATMAN,
afxRegApartmentThreading,
_dwLCCBatmanOleMisc,
_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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值