(安全生产)使你的A控件执行时不弹出安全性提示

上传人:管****问 文档编号:126086537 上传时间:2020-03-21 格式:DOC 页数:7 大小:42.07KB
返回 下载 相关 举报
(安全生产)使你的A控件执行时不弹出安全性提示_第1页
第1页 / 共7页
(安全生产)使你的A控件执行时不弹出安全性提示_第2页
第2页 / 共7页
(安全生产)使你的A控件执行时不弹出安全性提示_第3页
第3页 / 共7页
(安全生产)使你的A控件执行时不弹出安全性提示_第4页
第4页 / 共7页
(安全生产)使你的A控件执行时不弹出安全性提示_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《(安全生产)使你的A控件执行时不弹出安全性提示》由会员分享,可在线阅读,更多相关《(安全生产)使你的A控件执行时不弹出安全性提示(7页珍藏版)》请在金锄头文库上搜索。

1、我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘。注意,这里不会弹出警告是说在执行时不会弹出,也就是说已经安装了这个ActiveX控件。如果要下载安装这个ActiveX控件时不会弹出安全警告,恐怕就得去买数字证书了。不过即使有数字证书,还是得用户同意后才会下载安装。以下两种方法在WINXP-SP2+VC6下通过。方法1:修改注册表可能你在看完下面的过程后会发现,程序没有一个地方对注册表操作过。其实不然,这里所谓的修改注册表的方法就是使用组件类型管理器

2、(Component Categories Manager)创建一个正确的入口到系统注册表。IE通过检测注册表判断一个控件是否可以安全地初始化和脚本操作。IE会通过调用 ICatInformation:IsClassOfCategories 方法确定控件是否支持给出的安全性分组。其中对注册表的操作都已经封装起来,隐藏在底层了,所以看不到。必须包括两个头文件#include #include const GUID CDECL CLSID_SafeItem = 0xD321B11E, 0x8E79, 0x4829, 0xAB, 0x80, 0x9E, 0x59, 0x92, 0x06, 0xAB,

3、 0xB7;/用你的控件类GUID替换/ 注册组件种类为安全HRESULT AddCategorySafty(CATID catid, TCHAR* 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; CATEGORYINFO catinfo;

4、 catinfo.catid = catid; catinfo.lcid = 0x0409 ; / 英语语言 / 最长只拷贝127个字符。 int len = lstrlen(catDescription);if (len 127) len = 127; lstrcpyn(TCHAR*)(catinfo.szDescription), catDescription, len+1); hr = pcr-RegisterCategories(1, &catinfo);pcr-Release(); return hr;/移除已经注册为安全的组件种类HRESULT RemoveCategorySaft

5、y(CATID catid) ICatRegister* pcr = NULL ; HRESULT hr = S_OK ; hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void*)&pcr); if (FAILED(hr) return hr; hr = pcr-UnRegisterCategories(1, &catid);pcr-Release(); return hr;/ 把你的控件注册到已经注册为安全的组件种类HRESULT R

6、egisterCLSIDInCategory(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 rgcatid1 ; rgcatid0 = catid; hr = pcr-RegisterClassImplCategor

7、ies(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*)

8、&pcr); if (SUCCEEDED(hr) / Unregister this category as being implemented by the class. CATID rgcatid1 ; rgcatid0 = catid; hr = pcr-UnRegisterClassImplCategories(clsid, 1, rgcatid); if (pcr != NULL) pcr-Release(); return hr;/使你的控件不弹出警告地执行HRESULT MakeActiveXSafty(REFCLSID clsid)HRESULT hr; hr = AddCat

9、egorySafty(CATID_SafeForInitializing, _T(Controls safely initializable!); if (FAILED(hr) return hr; hr = RegisterCLSIDInCategory(clsid, CATID_SafeForInitializing); if (FAILED(hr) return hr; hr = AddCategorySafty(CATID_SafeForScripting, _T(Controls safely scriptable!); if (FAILED(hr) return hr; hr =

10、RegisterCLSIDInCategory(clsid, CATID_SafeForScripting);return hr;/去除控件的安全执行性HRESULT UnMakeActiveXSafty(REFCLSID clsid)HRESULT hr; hr = UnRegisterCLSIDInCategory(clsid, CATID_SafeForInitializing); if (FAILED(hr) return hr; hr = UnRegisterCLSIDInCategory(clsid, CATID_SafeForScripting); if (FAILED(hr)

11、return hr;/下面的代码是把安全组件种类去掉。去掉的话,如果有其他的控件注册为这两个种类/那么其他的控件执行时就会弹出警告。需不需要下面的代码就见仁见智,看实际情况了 hr = RemoveCategorySafty(CATID_SafeForInitializing); if (FAILED(hr) return hr; hr = RemoveCategorySafty(CATID_SafeForScripting);return hr;然后在DllRegisterServer函数的“return NOERROR;”前添加如下代码:HRESULT hr = MakeActiveXSa

12、fty(CLSID_SafeItem);if (FAILED(hr) return hr;在DllUnregisterServer函数的“AFX_MANAGE_STATE(_afxModuleAddrThis);”后添加如下代码:HRESULT hr = UnMakeActiveXSafty(CLSID_SafeItem);if (FAILED(hr) OutputDebugString(_T(去除控件的安全执行性时出错!);方法2:实现ObjectSafe接口我创建了一个MFC ActiveX ControlWizard的工程,工程为TestAX,它的控件类是CTestAXCtrl,下面所有

13、的代码和操作都是在这个类的头文件和实现文件中进行。红色的部分是为了实现ObjectSafe接口而增加的代码。在头文件中:#if !defined(AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_)#define AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ #include #include /增加这个头文件/ TestAXCtl.h : Declaration of the CTestAXCtrl ActiveX Control class./ CTestAXCtrl : See TestAXCtl.cpp for implementation.class CTestAXCtrl : public COleControlDECLARE_DYNCREATE(CTestAXCtrl)/ Constructorpublic:CTestAXCtrl();/增加如下代码:DECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(MyObjSafe, IObjectSafety)STDMETH

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 经营企划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号