




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘。注意,这里不会弹出警告是说在执行时不会弹出,也就是说已经安装了这个ActiveX控件。如果要下载安装这个ActiveX控件时不会弹出安全警告,恐怕就得去买数字证书了。不过即使有数字证书,还是得用户同意后才会下载安装。以下两种方法在WINXP-SP2+VC6下通过。方法1:修改注册表可能你在看完下面的过程后会发现,程序没有一个地方对注册表操作过。其实不然,这里所谓的修改注册表的方法就是使用组件类型管理器(Component Categories Manager)创建一个正确的入口到系统注册表。IE通过检测注册表判断一个控件是否可以安全地初始化和脚本操作。IE会通过调用 ICatInformation:IsClassOfCategories 方法确定控件是否支持给出的安全性分组。其中对注册表的操作都已经封装起来,隐藏在底层了,所以看不到。必须包括两个头文件#include #include const GUID CDECL CLSID_SafeItem = 0xD321B11E, 0x8E79, 0x4829, 0xAB, 0x80, 0x9E, 0x59, 0x92, 0x06, 0xAB, 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; 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 RemoveCategorySafty(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 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 rgcatid1 ; rgcatid0 = 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 rgcatid1 ; rgcatid0 = catid; hr = pcr-UnRegisterClassImplCategories(clsid, 1, rgcatid); if (pcr != NULL) pcr-Release(); return hr;/使你的控件不弹出警告地执行HRESULT MakeActiveXSafty(REFCLSID clsid)HRESULT hr; hr = AddCategorySafty(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 = 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) return hr;/下面的代码是把安全组件种类去掉。去掉的话,如果有其他的控件注册为这两个种类/那么其他的控件执行时就会弹出警告。需不需要下面的代码就见仁见智,看实际情况了 hr = RemoveCategorySafty(CATID_SafeForInitializing); if (FAILED(hr) return hr; hr = RemoveCategorySafty(CATID_SafeForScripting);return hr;然后在DllRegisterServer函数的“return NOERROR;”前添加如下代码:HRESULT hr = MakeActiveXSafty(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,下面所有的代码和操作都是在这个类的头文件和实现文件中进行。红色的部分是为了实现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)STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) ( REFIID riid, DWORD _RPC_FAR *pdwSupportedOptions, DWORD _RPC_FAR *pdwEnabledOptions );STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) ( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions );END_INTERFACE_PART(MyObjSafe);。在实现文件中:/ TestAXCtl.cpp : Implementation of the CTestAXCtrl ActiveX Control class.#include stdafx.h#include testAX.h#include TestAXCtl.h#include TestAXPpg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifIMPLEMENT_DYNCREATE(CTestAXCtrl, COleControl)/接口映射BEGIN_INTERFACE_MAP(CTestAXCtrl, COleControl )INTERFACE_PART(CTestAXCtrl, IID_IObjectSafety, MyObjSafe)END_INTERFACE_MAP()。(其他代码省略)/接口的函数实现ULONG FAR EXPORT CTestAXCtrl:XMyObjSafe:AddRef()METHOD_PROLOGUE(CTestAXCtrl, MyObjSafe)return pThis-ExternalAddRef();ULONG FAR EXPORT CTestAXCtrl:XMyObjSafe:Release()METHOD_PROLOGUE(CTestAXCtrl, MyObjSafe)return pThis-ExternalRelease();HRESULT FAR EXPORT CTestAXCtrl:XMyObjSafe:QueryInterface(REFIID iid, void FAR* FAR* ppvObj)METHOD_PROLOGUE(CTestAXCtrl, MyObjSafe)return (HRESULT)pThis-ExternalQueryInterface(&iid, ppvObj);/调用方法与数据是否可信任,设置这两个标志位就可以了const DWORD g_dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;const DWORD g_dwNotSupportedBits = g_dwSupporte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年儿科典型疾病诊治方案论证试卷答案及解析
- 普通高中课程开发与实施方案
- 2025年内分泌科糖尿病并发症预防及控制方案练习答案及解析
- 校企合作实习生管理与培养方案模板
- 2025年风湿免疫科风湿性关节炎诊治方案选择测验答案及解析
- 零售超市库存管理与盘点方案
- 2025年肝胆胰疾病诊疗方案考核答案及解析
- 员工培训计划设计与实施方案
- 汽车维修服务合同标准版
- 智能制造车间设备智能化改造方案
- 2024版公司100%股权转让协议
- 消化内科护士进修汇报
- 2024年4月自考00840第二外语(日语)试题
- 便利店设计方案
- 对意外伤害儿童的紧急救治方法
- 为成果而管理
- 乳腺癌骨转移护理查房课件
- 新视野大学英语1读写教程-Unit1-Fresh-Start-课件
- 管路清灰施工方案
- 客户信息登记表
- 不合格品处置记录表(标准版)
评论
0/150
提交评论