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

下载本文档

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

文档简介

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

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

3、lude <Objsafe.h>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 ;&#

4、160;   hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,    NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void*)&pcr);    if (FAILED(hr)        return hr;    CATEGORYINFO catinfo;    catinfo

5、.catid = catid;    catinfo.lcid = 0x0409 ; / 英语语言    / 最长只拷贝127个字符。    int len = lstrlen(catDescription);if (len > 127)   len = 127;    lstrcpyn(TCHAR*)(catinfo.szDescription), catDescription, len+1);    hr = pcr

6、->RegisterCategories(1, &catinfo);pcr->Release();    return hr;/移除已经注册为安全的组件种类HRESULT RemoveCategorySafty(CATID catid)    ICatRegister* pcr = NULL ;    HRESULT hr = S_OK ;    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,

7、   NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void*)&pcr);    if (FAILED(hr)        return hr;    hr = pcr->UnRegisterCategories(1, &catid);pcr->Release();    return hr;/ 把你的控件注册到已经注册为安全的组件种类H

8、RESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)    ICatRegister* pcr = NULL ;    HRESULT hr = S_OK ;    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,    NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void*)&pcr); &#

9、160;  if (SUCCEEDED(hr)       CATID rgcatid1 ;   rgcatid0 = catid;   hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);        if (pcr != NULL)        pcr->Release(); 

10、   return hr;/ 把你的控件从安全组件种类移除HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)    ICatRegister* pcr = NULL ;    HRESULT hr = S_OK ;    hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,    NULL, CLSCTX_INPROC_SERVER, I

11、ID_ICatRegister, (void*)&pcr);    if (SUCCEEDED(hr)       / Unregister this category as being "implemented" by the class.   CATID rgcatid1 ;   rgcatid0 = catid;   hr = pcr->UnRegisterClassImplCategories(clsid, 1,

12、rgcatid);        if (pcr != NULL)        pcr->Release();    return hr;/使你的控件不弹出警告地执行HRESULT MakeActiveXSafty(REFCLSID clsid)HRESULT hr;    hr = AddCategorySafty(CATID_SafeForInitializing,    _

13、T("Controls safely initializable!");    if (FAILED(hr)        return hr;    hr = RegisterCLSIDInCategory(clsid, CATID_SafeForInitializing);    if (FAILED(hr)        return hr;

14、    hr = AddCategorySafty(CATID_SafeForScripting, _T("Controls safely scriptable!");    if (FAILED(hr)        return hr;    hr = RegisterCLSIDInCategory(clsid, CATID_SafeForScripting);return hr;/去除控件的安全执行性HRESU

15、LT UnMakeActiveXSafty(REFCLSID clsid)HRESULT hr;    hr = UnRegisterCLSIDInCategory(clsid, CATID_SafeForInitializing);    if (FAILED(hr)        return hr;    hr = UnRegisterCLSIDInCategory(clsid, CATID_SafeForScripting);&

16、#160;   if (FAILED(hr)        return hr;/下面的代码是把安全组件种类去掉。去掉的话,如果有其他的控件注册为这两个种类/那么其他的控件执行时就会弹出警告。需不需要下面的代码就见仁见智,看实际情况了    hr = RemoveCategorySafty(CATID_SafeForInitializing);    if (FAILED(hr)     

17、0;  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(_

18、afxModuleAddrThis);”后添加如下代码:HRESULT hr = UnMakeActiveXSafty(CLSID_SafeItem);if (FAILED(hr)        OutputDebugString(_T("去除控件的安全执行性时出错!");方法2:实现ObjectSafe接口我创建了一个MFC ActiveX ControlWizard的工程,工程为TestAX,它的控件类是CTestAXCtrl,下面所有的代码和操作都是在这个类的头文件和实现文件中进行。红色的部分是为了

19、实现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 <ComCat.h>#include <ObjSafe.h>/增加这个头文件/ Tes

20、tAXCtl.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, IObjec

21、tSafety)STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (    REFIID riid,   DWORD _RPC_FAR *pdwSupportedOptions,   DWORD _RPC_FAR *pdwEnabledOptions   );STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (    REFIID riid,   DWORD dwOptionSetMask

22、,   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#d

23、efine 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

24、: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)METH

25、OD_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_dwSupportedBits;HRESULT FAR EXPORT CTestAXCtrl:XMyObjSafe:GetInterfaceSafetyOptions(REFIID riid,                   DWORD _RPC_

温馨提示

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

评论

0/150

提交评论