`
yangzb
  • 浏览: 3507283 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全。你想允许这种交互

 
阅读更多

如果采用VC++开发的ActiveX,那么第一次运行的时候,IE中就会提示,“在此页上的ActiveX控件和本页上的其他部分 的交互可能不安全,你想允许这种交互吗?”在网上找了很多资料,原理介绍的多,但是真正如何做,介绍的比较少,因此这里把实际的步骤一步一步的记录下来 了,供大家参考。
1.1 去除ActiveX访问时的安全提示
当ActiveX第一次被访问时,会出现如下提示框:

这是IE浏览器的安全机制造成的,我们可以采用下面的步骤来去除这个提示信息:
1.1.1 在CDemoCtl的头文件.h中增加对objsave的引用
#include <objsafe.h>
1.1.2 在其protected声明区增加如下内容:
//去掉安全警告 BEGIN
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety)
STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions);
STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions);
END_INTERFACE_PART(ObjectSafety)
//去掉安全警告 END
1.1.3 在CDemoCtl的实现类.cpp的IMPLEMENT_DYNCREATE(CActivexFirstCtrl, COleControl)这一行后增加如下内容:
    
//去掉安全警告 BEGIN
BEGIN_INTERFACE_MAP(CDemoCtl, COleControl)
INTERFACE_PART(CDemoCtl, IID_IObjectSafety, ObjectSafety)
END_INTERFACE_MAP()
// Implementation of IObjectSafety
STDMETHODIMP CDemoCtl::XObjectSafety::GetInterfaceSafetyOptions(
REFIID riid,
DWORD __RPC_FAR *pdwSupportedOptions,
DWORD __RPC_FAR *pdwEnabledOptions)
{
METHOD_PROLOGUE_EX(CDemoCtl, ObjectSafety)
if (!pdwSupportedOptions || !pdwEnabledOptions)
{
return E_POINTER;
}
*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
*pdwEnabledOptions = 0;
if (NULL == pThis->GetInterface(&riid))
{
TRACE("Requested interface is not supported.\n");
return E_NOINTERFACE;
}
// What interface is being checked out anyhow?
OLECHAR szGUID[39];
int i = StringFromGUID2(riid, szGUID, 39);
if (riid == IID_IDispatch)
{
// Client wants to know if object is safe for scripting
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
return S_OK;
}
else if (riid == IID_IPersistPropertyBag
|| riid == IID_IPersistStreamInit
|| riid == IID_IPersistStorage
|| riid == IID_IPersistMemory)
{
// Those are the persistence interfaces COleControl derived controls support
// as indicated in AFXCTL.H
// Client wants to know if object is safe for initializing from persistent data
*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
return S_OK;
}
else
{
// Find out what interface this is, and decide what options to enable
TRACE("We didn"t account for the safety of this interface, and it"s one we support...\n");
return E_NOINTERFACE;
}
}
STDMETHODIMP CDemoCtl::XObjectSafety::SetInterfaceSafetyOptions(
REFIID riid,
DWORD dwOptionSetMask,
DWORD dwEnabledOptions)
{
METHOD_PROLOGUE_EX(CDemoCtl, ObjectSafety)
OLECHAR szGUID[39];
// What is this interface anyway?
// We can do a quick lookup in the registry under HKEY_CLASSES_ROOT\Interface
int i = StringFromGUID2(riid, szGUID, 39);
if (0 == dwOptionSetMask && 0 == dwEnabledOptions)
{
// the control certainly supports NO requests through the specified interface
// so it"s safe to return S_OK even if the interface isn"t supported.
return S_OK;
}
// Do we support the specified interface?
if (NULL == pThis->GetInterface(&riid))
{
TRACE1("%s is not support.\n", szGUID);
return E_FAIL;
}
if (riid == IID_IDispatch)
{
TRACE("Client asking if it"s safe to call through IDispatch.\n");
TRACE("In other words, is the control safe for scripting?\n");
if (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions)
{
return S_OK;
}
else
{
return E_FAIL;
}
}
else if (riid == IID_IPersistPropertyBag
|| riid == IID_IPersistStreamInit
|| riid == IID_IPersistStorage
|| riid == IID_IPersistMemory)
{
TRACE("Client asking if it"s safe to call through IPersist*.\n");
TRACE("In other words, is the control safe for initializing from persistent data?\n");
if (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask && INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions)
{
return NOERROR;
}
else
{
return E_FAIL;
}
}
else
{
TRACE1("We didn"t account for the safety of %s, and it"s one we support...\n", szGUID);
return E_FAIL;
}
}
STDMETHODIMP_(ULONG) CDemoCtl::XObjectSafety::AddRef()
{
METHOD_PROLOGUE_EX_(CDemoCtl, ObjectSafety)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) CDemoCtl::XObjectSafety::Release()
{
METHOD_PROLOGUE_EX_(CDemoCtl, ObjectSafety)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP CDemoCtl::XObjectSafety::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(CDemoCtl, ObjectSafety)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
//去掉安全警告 END

 

分享到:
评论

相关推荐

    在此页面上的activex控件和本页上的其他控件的交互可能不安全

    标题与描述中提到的知识点是关于ActiveX控件在网页上的安全交互问题。这涉及到浏览器安全、ActiveX技术以及跨控件通信等多个方面。以下是对这些知识点的详细解析: ### ActiveX控件简介 ActiveX控件是一种由...

    在此页面上的Activex控件和本页上的其他部分及交互可能不安全解决办法

    在此页面上的Activex控件和本页上的其他部分及交互可能不安全解决办法,步骤清晰,按步骤操作即可。

    ActiveX组件与JavaScript交互

    ### ActiveX组件与JavaScript交互详解 #### 一、概述 ActiveX组件是一种可以在网页或桌面应用程序中运行的小型可执行程序,它支持多种语言编写,包括C++等。JavaScript是广泛应用于网页开发的一种脚本语言。本文将...

    c# 编写activex控件 并与网页交互

    在本教程中,我们将探讨如何使用C#语言编写ActiveX控件,并实现与网页的交互,包括如何传递数据给网页以及如何调用网页中的方法。 一、ActiveX控件基础 ActiveX是微软推出的一种组件对象模型(COM),它允许开发者...

    解决ActiveX控件没有在此计算机上注册的问题

    在IT领域,ActiveX控件是一种由微软开发的技术,它允许开发者创建交互式的网页和应用程序。ActiveX控件是基于COM(Component Object Model)组件模型的,这些控件可以在Internet Explorer浏览器中运行,提供诸如...

    不弹出警告的ActiveX控件的源代码

    在描述中提到的"不弹出警告的ActiveX控件"是指一种特殊设计的控件,它可以在运行时避免向用户显示通常与安全相关的警告对话框。这种控件对于开发人员来说具有一定的价值,因为它可以提供更流畅的用户体验,同时...

    ActiveX控件不能例示

    在IT领域,ActiveX控件是微软开发的一种技术,它允许开发者创建可以在Web浏览器或其他支持ActiveX的应用程序中运行的交互式对象。ActiveX控件是基于组件对象模型(Component Object Model, COM)的,可以提供丰富的...

    IE一键设置脚本ActiveX控件常规允许工具

    在互联网早期,ActiveX控件是Microsoft Internet Explorer(IE)浏览器中一种重要的技术,用于提供丰富的交互性和功能扩展。ActiveX控件是由软件开发者创建的小型应用程序,可以在网页上运行,为用户提供额外的功能...

    在MATLAB图形用户界面设计中使用ActiveX控件.pdf

    在MATLAB图形用户界面(GUI)设计中使用...整个文档的目的是为了指导开发者如何在MATLAB中使用ActiveX控件来增强图形用户界面的设计和功能实现,使得MATLAB开发的应用程序可以更好地与Windows环境和第三方组件交互。

    activex控件vc++编程

    在IT领域,ActiveX控件和VC++编程是两个重要的概念,它们经常结合在一起用于创建交互式的Windows应用程序。本文将深入探讨这两个主题以及如何在VC++环境中开发和使用ActiveX控件。 首先,ActiveX控件是Microsoft...

    大华摄像头ActiveX控件(ocx).zip

    在本案例中,这个控件可能是为了在用户的计算机上实现与大华摄像头的直接交互,例如进行实时视频预览、录像或者控制摄像头的某些功能。 ActiveX控件的核心特性包括: 1. **交互性**:控件可以与用户界面进行交互,...

    C#编写activex控件

    在IT行业中,ActiveX控件是一种古老的但仍然在某些场景下使用的技术,它允许开发者创建可以在Web页面上运行的小型应用程序或组件。ActiveX技术基于COM(Component Object Model)架构,通常由VB(Visual Basic)或...

    ActiveX控件清理工具

    ActiveX是微软在Internet Explorer浏览器和其他Windows应用程序中使用的一种技术,它允许开发人员创建交互式和动态的Web内容,例如插件、控件和应用程序。然而,随着时间的推移,这些控件可能会积累,导致系统性能...

    activex与js交互

    3. **示例**:在提供的"callJS"文件中,可能包含了一个示例,演示如何从ActiveX控件调用JavaScript函数,或者反之,这在需要利用ActiveX的强大功能但又希望在网页上保持用户友好交互时非常有用。 **应用场景**: - ...

    java调用activex控件

    ActiveX控件是一种Windows平台上的组件技术,允许不同应用程序间进行交互。这些控件可以嵌入到HTML页面中,以增强网页的功能性和互动性。然而,由于Java和ActiveX控件分属不同的平台和技术体系,实现两者间的交互...

    网页中显示带控件的ActiveX控件

    ActiveX控件是微软在Internet Explorer浏览器中引入的一种技术,用于增强网页的交互性和功能。在Web开发的早期,ActiveX被广泛应用于提供多媒体内容、软件下载、在线应用程序以及各种定制的用户界面元素。本文将深入...

    ActiveX控件 时钟初级

    ActiveX控件是一种在Windows平台上广泛使用的组件技术,它允许开发者创建可重用的软件部件,这些部件可以嵌入到各种应用程序中,提供特定的功能。在这个"ActiveX控件 时钟初级"的资源中,我们主要关注的是一个初级...

    ActiveX控件做的时钟

    ActiveX控件是一种在Windows平台上广泛使用的组件技术,由微软公司开发,主要用于构建交互式的Web应用程序和增强桌面应用的功能。在这个“ActiveX控件做的时钟”项目中,我们主要探讨的是如何利用ActiveX控件来创建...

    整个ActiveX控件源码

    ActiveX控件是微软开发的一种技术,用于在Internet Explorer浏览器和其他支持ActiveX的环境中嵌入功能丰富的应用程序或组件。这些控件通常是用Microsoft Visual C++、Visual Basic等编程语言编写的,可以提供交互式...

Global site tag (gtag.js) - Google Analytics