VC6.0编写IE可运行的ActiveX,增加安全检测项,不支持64位浏览器
2015-07-30 18:50
435 查看
综合网络上提供的方法,这个是比较全的App类的实现。
注册控件后,网页中访问时不再提示安全警告,也不必修改ie默认的安全级别。
// IDCardReader.cpp : Implementation of CIDCardReaderApp and DLL registration.
#include "stdafx.h"
#include "IDCardReader.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "Cathelp.h"
#include "objsafe.h"
#include "comcat.h" //CATID 的定义在这个控件里,很重要这个头文件
CIDCardReaderApp NEAR theApp;
const GUID CDECL BASED_CODE _tlid =
{ 0xb49cfb44, 0x5166, 0x49a1, { 0xb9, 0x68, 0x3e, 0x8a, 0x2d, 0x79, 0x22, 0xa1 } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;
//以下是安全接口标识,必须与控件的ID相同
const GUID CDECL CLSID_SafeItem ={0x10946843, 0x7507, 0x44fe, {0xac, 0xe8, 0x2b, 0x34, 0x83, 0xd1, 0x79, 0xb7}};
/*
根据msdn的提示要定义这两项,其实是vc6.0以下的版本,vc6 引入 comcat.h 即可
const CATID CATID_SafeForScripting={0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
const CATID CATID_SafeForInitializing= { 0xb49cfb44, 0x5166, 0x49a1, { 0xb9, 0x68, 0x3e, 0x8a, 0x2d, 0x79, 0x22, 0xa1 } };
*/
////////////////////////////////////////////////////////////////////////////
// CIDCardReaderApp::InitInstance - DLL initialization
BOOL CIDCardReaderApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
// TODO: Add your own module initialization code here.
}
return bInit;
}
////////////////////////////////////////////////////////////////////////////
// CIDCardReaderApp::ExitInstance - DLL termination
int CIDCardReaderApp::ExitInstance()
{
// TODO: Add your own module termination code here.
return COleControlModule::ExitInstance();
}
/////////////////////////////////////////////////////////////////////////////
//<--新增内容
// 创建组件种类
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)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
//<--新增内容
HRESULT hr = S_OK;
// 标记控件初始化安全.
// 创建初始化安全组件种类
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)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
注册控件后,网页中访问时不再提示安全警告,也不必修改ie默认的安全级别。
// IDCardReader.cpp : Implementation of CIDCardReaderApp and DLL registration.
#include "stdafx.h"
#include "IDCardReader.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "Cathelp.h"
#include "objsafe.h"
#include "comcat.h" //CATID 的定义在这个控件里,很重要这个头文件
CIDCardReaderApp NEAR theApp;
const GUID CDECL BASED_CODE _tlid =
{ 0xb49cfb44, 0x5166, 0x49a1, { 0xb9, 0x68, 0x3e, 0x8a, 0x2d, 0x79, 0x22, 0xa1 } };
const WORD _wVerMajor = 1;
const WORD _wVerMinor = 0;
//以下是安全接口标识,必须与控件的ID相同
const GUID CDECL CLSID_SafeItem ={0x10946843, 0x7507, 0x44fe, {0xac, 0xe8, 0x2b, 0x34, 0x83, 0xd1, 0x79, 0xb7}};
/*
根据msdn的提示要定义这两项,其实是vc6.0以下的版本,vc6 引入 comcat.h 即可
const CATID CATID_SafeForScripting={0x7dd95801,0x9882,0x11cf,{0x9f,0xa9,0x00,0xaa,0x00,0x6c,0x42,0xc4}};
const CATID CATID_SafeForInitializing= { 0xb49cfb44, 0x5166, 0x49a1, { 0xb9, 0x68, 0x3e, 0x8a, 0x2d, 0x79, 0x22, 0xa1 } };
*/
////////////////////////////////////////////////////////////////////////////
// CIDCardReaderApp::InitInstance - DLL initialization
BOOL CIDCardReaderApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
// TODO: Add your own module initialization code here.
}
return bInit;
}
////////////////////////////////////////////////////////////////////////////
// CIDCardReaderApp::ExitInstance - DLL termination
int CIDCardReaderApp::ExitInstance()
{
// TODO: Add your own module termination code here.
return COleControlModule::ExitInstance();
}
/////////////////////////////////////////////////////////////////////////////
//<--新增内容
// 创建组件种类
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)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
//<--新增内容
HRESULT hr = S_OK;
// 标记控件初始化安全.
// 创建初始化安全组件种类
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)
{
AFX_MANAGE_STATE(_afxModuleAddrThis);
if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
相关文章推荐
- iOS 修改状态栏字体的颜色
- hdu 5317 多校第三场
- 整合:求最短路算法 floyd prim dijkstra Kruskal spfa算法简析
- 权利指数(hdu 1557)
- hdoj 2032 杨辉三角
- SQL Server 2008 Windows身份验证改为混合模式身份验证
- js 获取访问链接参数
- HDOJ 1000 1001丶
- windows下Mysql解决Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
- hdoj 1950 Bridging signals 【DP经典问题LIS 的 经典算法】
- C#中Object转化为json对象
- 为什么计算机的学生要学习 Linux 开源技术
- HDU 1203 I NEED A OFFER!
- 使用whIle循环语句和变量打印九九乘法表
- java8 函数式编程
- easyUI Tabs
- Hibernate_12_HQL句子
- grep 命令
- 人眼疲劳检测之opencv人眼检测xml说明
- 对象的删除与创建