使你的ActiveX控件执行时不弹出安全性提示_第1页
使你的ActiveX控件执行时不弹出安全性提示_第2页
使你的ActiveX控件执行时不弹出安全性提示_第3页
使你的ActiveX控件执行时不弹出安全性提示_第4页
使你的ActiveX控件执行时不弹出安全性提示_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、没有一个地方对注册表操作过。其实 不然,这里所谓的修改注册表的方法就是使用组件类型管理器(ComponentCategories Manager)创建一个正确的入口到系统注册表。IE通过检测注册表判 断一个控件是否可以安全地初始化和脚本操作。 IE 会通过调用 ICatInformation:IsClassOfCategories方法确定控件是否支持给出的安全性分组。其中对注册表的操作都已经封装起来,隐藏在底层了,所以看不到。必须包括两个头文件#include <comcat.h>#include <Objsafe.h> const GUID CDECL CLSID_S

3、afeItem =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_I

4、CatRegister, (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->RegisterCategorie

5、s(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

6、->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, (v

7、oid*)&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 =

8、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

9、 (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 (FAILE

10、D(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(cl

11、sid, 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;h

12、r = RemoveCategorySafty(CATID_SafeForScripting);return hr;然后在DIIRegisterServer函数的“ return NOERROR”前添加如下代码:HRESULT hr = MakeActiveXSafty(CLSID_SafeItem);if (FAILED(hr)return hr;在 DIIUnregisterServer 函数的“ AFX_MANAGE_STATE(_afxModuIeAddrThis”); 后添加如下代码:HRESULT hr = UnMakeActiveXSafty(CLSID_SafeItem);if

13、 (FAILED(hr)OutputDebugString(_T(" 去除控件的安全执行性时出错 !");方法 2:实现 ObjectSafe 接口 我创建了一个 MFCActiveX ControlWizard 的工程, 工程为 TestAX ,它的控件类是 CTestAXCtrl , 下面所有的代码和操作都是在这个类的头文件和实现文件中进行。红色的部分是为了实现ObjectSafe 接口而增加的代码。在头文件中:#if !defined(AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_)#def

14、ine AFX_TESTAXCTL_H_C2084528_F93E_42D8_A13D_7E38775A0481_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000/ #include <ComCat.h>#include <ObjSafe.h>/ 增加这个头文件/ TestAXCtl.h : Declaration of the CTestAXCtrl ActiveX Control class./ CTestAXCtrl : See TestAXCtl.cpp for impl

15、ementation.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_F

16、AR *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"#i

17、nclude "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, MyObjS

18、afe) 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();iid,HRESULTF

19、AREXPORTCTestAXCtrl:XMyObjSafe:QueryInterface(REFIID 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_dwNotSuppo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论