论坛首页 入门讨论版 企业应用

请教关于activex被ie安全禁止的问题

浏览 113 次
该帖已经被评为新手帖
作者 正文
时间:2008-05-09 关键字: activex
各位好:
最近我做一个web打印功能,要求能在客户端实现打印,我调用了ie自带的打印控建,但打印中会有页眉和页尾,这是我不需要的,于是我使用js创建activex修改了打印的注册表,功能实现了,但在调试中发现ie会自动的禁止activex的运行,我在网上查找了一些资料,据说这种操作是安全的,但我公司的网中是完全不行的,我想请问各位有没有能用代码实现能力不让ie拒绝我的操作,谢谢!!!
   
时间:2008-05-09
你的控件必须在注册时标记实现“控件初始化安全”和“脚本安全”俩个接口。

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"初始化安全!");
	if (FAILED(hr))
		return hr;

	// 注册初始化安全
	hr = RegisterCLSIDInCategory(_clsid, CATID_SafeForInitializing);
	if (FAILED(hr))
		return hr;


	// 创建脚本安全组件种类 
	hr = CreateComponentCategory(CATID_SafeForScripting, L"脚本操作安全!");
	if (FAILED(hr))
		return hr;


	// 标记控件脚本安全, 注册脚本安全组件种类
	hr = RegisterCLSIDInCategory(_clsid, CATID_SafeForScripting);
	if (FAILED(hr))
		return hr;

	return NOERROR;
}



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 = 0x0804 ; // 中文

	// 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;
}
   
0 请登录后投票
时间:2008-05-11
谢谢楼上大哥哈 我仔细看一下
   
0 请登录后投票
时间:2008-05-11
楼上大哥这个是C++语言吧 我不怎么会的哈 我用的是JAVA
   
0 请登录后投票
时间:2008-05-12
MARK
我也碰到过这样的问题,尚未解决
   
0 请登录后投票
论坛首页 入门讨论版 企业应用

跳转论坛:
JavaEye推荐
    快速回复 引用上一条消息 (Alt+S)