如何才能让IE浏览器安装调用未签名的ActiveX控件

yizhihongxing

该攻略需要分为两个部分:生成未签名的ActiveX控件和在IE浏览器中安装调用未签名的ActiveX控件。

生成未签名的ActiveX控件

  1. 在Visual Studio中创建一个ActiveX控件项目,并将其编译为未签名的DLL文件。

示例代码如下所示:

// MyActiveXCtrl.h

#pragma once

#ifdef MYACTIVEXCTRL_EXPORTS
#define MYACTIVEXCTRL_API __declspec(dllexport)
#else
#define MYACTIVEXCTRL_API __declspec(dllimport)
#endif

#include <afxwin.h>

// CMyActiveXCtrl

class MYACTIVEXCTRL_API CMyActiveXCtrl : public COleControl
{
    DECLARE_DYNCREATE(CMyActiveXCtrl)

public:
    virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    virtual BOOL OnAmbientProperty(COleControlSite* pSite, DISPID dispid);
    virtual BOOL IsSubclassedControl();

protected:
    DECLARE_OLECREATE_EX(CMyActiveXCtrl)    // Class factory and guid
    DECLARE_OLETYPELIB(CMyActiveXCtrl)      // GetTypeInfo
    DECLARE_PROPPAGEIDS(CMyActiveXCtrl)     // Property page IDs
    DECLARE_OLECTLTYPE(CMyActiveXCtrl)

    // Message maps
    DECLARE_MESSAGE_MAP()

    // Dispatch maps
    DECLARE_DISPATCH_MAP()

    // Event maps
    DECLARE_EVENT_MAP()

    // Property prototypes
    BOOL m_bTransparent;

    // Property accessors
    BOOL GetTransparent();
    void SetTransparent(BOOL bNewValue);
};
// MyActiveXCtrl.cpp

#include "pch.h"
#include "MyActiveXCtrl.h"

// CMyActiveXCtrl

IMPLEMENT_DYNCREATE(CMyActiveXCtrl, COleControl)

// Message map

BEGIN_MESSAGE_MAP(CMyActiveXCtrl, COleControl)
    ON_WM_CREATE()
END_MESSAGE_MAP()

// Dispatch map

BEGIN_DISPATCH_MAP(CMyActiveXCtrl, COleControl)
END_DISPATCH_MAP()

// Event map

BEGIN_EVENT_MAP(CMyActiveXCtrl, COleControl)
END_EVENT_MAP()

// Property pages

// TODO: Add more property pages as needed.  Remember to increase the count!
BEGIN_PROPPAGEIDS(CMyActiveXCtrl, 1)
    PROPPAGEID(CMyActiveXCtrlPropPage::guid)
END_PROPPAGEIDS(CMyActiveXCtrl)

// Initialize class factory and guid

IMPLEMENT_OLECREATE_EX(CMyActiveXCtrl, "MYACTIVEXCTRL.MyActiveXCtrl.1",
    0x5c817bf0, 0x1f30, 0x40a1, 0x8a, 0x9c, 0xd5, 0x78, 0x40, 0xa6, 0x7, 0x8d)

// Type library ID and version

IMPLEMENT_OLETYPELIB(CMyActiveXCtrl, _tlid, _wVerMajor, _wVerMinor)

// Interface IDs

const IID IID_DMyActiveXCtrl = {0x583dfe98,0xecd6,0x47b2,{0xa0,0xdb,0xe2,0x29,0x70,0x26,0x94,0x9}};

// Control type information

IMPLEMENT_OLECTLTYPE(CMyActiveXCtrl, IDS_MYACTIVEXCTRL, _dwMyActiveXCtrlOleMisc,
    _DMyActiveXCtrl, _tlid, _wVerMajor, _wVerMinor)

// CMyActiveXCtrl::CMyActiveXCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CMyActiveXCtrl

BOOL CMyActiveXCtrl::CMyActiveXCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    if (bRegister)
        return AfxOleRegisterControlClass(
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_MYACTIVEXCTRL,
            IDB_MYACTIVEXCTRL,
            afxRegApartmentThreading,
            _dwMyActiveXCtrlOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);

    AfxOleUnregisterClass(m_clsid, m_lpszProgID);
    return TRUE;
}

// CMyActiveXCtrl::CMyActiveXCtrl - Constructor

CMyActiveXCtrl::CMyActiveXCtrl()
{
    InitializeIIDs(&IID_DMyActiveXCtrl, &IID_DMyActiveXCtrlEvents);
    // TODO: Initialize your control's instance data here.
}

// CMyActiveXCtrl::~CMyActiveXCtrl - Destructor

CMyActiveXCtrl::~CMyActiveXCtrl()
{
    // TODO: Cleanup your control's instance data here.
}

// CMyActiveXCtrl::OnDraw - Drawing function

void CMyActiveXCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
    if (!pdc)
        return;

    DoSuperclassPaint(pdc, rcBounds);

    if (m_bTransparent)
        return;

    // TODO: Replace the following code with your own drawing code.

    pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH) GetStockObject(WHITE_BRUSH)));
    pdc->Ellipse(rcBounds);
}

// CMyActiveXCtrl::DoPropExchange - Persistence support

void CMyActiveXCtrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);
}

// CMyActiveXCtrl::OnResetState - Reset control to default state

void CMyActiveXCtrl::OnResetState()
{
    COleControl::OnResetState();  // Resets defaults found in DoPropExchange

    // TODO: Reset any other control state here.
}

// CMyActiveXCtrl::PreCreateWindow - Modify parameters for CreateWindowEx

BOOL CMyActiveXCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.lpszClass = _T("STATIC");
    cs.style = WS_CHILD | WS_VISIBLE;
    return COleControl::PreCreateWindow(cs);
}

// CMyActiveXCtrl::OnAmbientProperty - Handle changes in ambient properties

BOOL CMyActiveXCtrl::OnAmbientProperty(COleControlSite* pSite, DISPID dispid)
{
    switch (dispid)
    {
        case DISPID_UNKNOWN:
        case DISPID_AMBIENT_BACKCOLOR:
        case DISPID_AMBIENT_DISPLAYNAME:
        case DISPID_AMBIENT_FONT:
        case DISPID_AMBIENT_FORECOLOR:
        case DISPID_AMBIENT_LOCALEID:
        case DISPID_AMBIENT_MESSAGEREFLECT:
        case DISPID_AMBIENT_SCALEUNITS:
        case DISPID_AMBIENT_TEXTALIGN:
        case DISPID_AMBIENT_USERMODE:
            InvalidateControl();
            break;

        case DISPID_AMBIENT_SHOWGRABHANDLES:
        case DISPID_AMBIENT_SHOWHATCHING:
        case DISPID_AMBIENT_UIDEAD:
        case DISPID_AMBIENT_USEVISUALSTYLE:
        case DISPID_AMBIENT_AUTOCLIP:
            break;

        default:
            return FALSE;
    }

    return TRUE;
}

// CMyActiveXCtrl::IsSubclassedControl - This is a subclassed control

BOOL CMyActiveXCtrl::IsSubclassedControl()
{
    return TRUE;
}

// CMyActiveXCtrl message handlers

int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;

    ModifyStyle(0, SS_CENTERIMAGE);  // Center bitmap
    return 0;
}

// CMyActiveXCtrl::GetTransparent - Getter for Transparent property

BOOL CMyActiveXCtrl::GetTransparent()
{
    return m_bTransparent;
}

// CMyActiveXCtrl::SetTransparent - Setter for Transparent property

void CMyActiveXCtrl::SetTransparent(BOOL bNewValue)
{
    m_bTransparent = bNewValue;
    InvalidateControl();
}
  1. 将控件的DLL文件上传至一个Web服务器上,以备后续安装调用。

在IE浏览器中安装调用未签名的ActiveX控件

  1. 在IE浏览器中打开Web服务器上传的DDL文件所在的URL,并等待该文件下载到本地。

  2. 在IE浏览器的地址栏输入“about:blank”,然后按下回车键,打开一个空白页面。

  3. 在空白页面上右击,选择“属性”,在出现的属性窗口中找到“自定义”选项卡,然后点击“新建”按钮,在“名称”字段中输入ActiveX控件的名称,如“MyActiveXCtrl”,在“值”字段中输入控件的CLSID,如“{5C817BF0-1F30-40A1-8A9C-D57840A6078D}”。

  4. 在空白页面上添加一个脚本标记,用于创建和调用控件的实例。

示例代码如下:

<html>
<head>
<title>My ActiveX Control Test Page</title>
<script language="javascript">
<!--
function load()
{
   var control = new ActiveXObject("MYACTIVEXCTRL.MyActiveXCtrl.1");
   document.body.appendChild(control);
}
//-->
</script>
</head>
<body onload="load()">
</body>
</html>
  1. 保存该空白页面,并再次在IE浏览器中打开该页面,即可看到控件已经被成功安装和调用。

另一个示例:

  1. 在IE浏览器中输入以下代码,将未签名的ActiveX控件作为object标记插入到HTML页面中:
<object id="myactivexctrl" codebase="http://mywebserver/myactivexctrl.dll" classid="clsid:5C817BF0-1F30-40A1-8A9C-D57840A6078D"></object>
  1. 在JS代码中调用ActiveXObject来创建控件的实例,示例代码如下所示:
var control = new ActiveXObject("MYACTIVEXCTRL.MyActiveXCtrl.1");
document.getElementById("myactivexctrl").appendChild(control);

该攻略不建议用于在生产环境中使用,因为在实际部署时,未签名的ActiveX控件会对系统安全性带来潜在的风险。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何才能让IE浏览器安装调用未签名的ActiveX控件 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Linux系统的服务器上Samba服务器端的配置教程

    当我们在Linux服务器上配置Samba服务器端时,需要进行以下步骤: 安装Samba 使用以下命令安装Samba: sudo apt-get install samba 配置Samba 1. 创建共享目录 创建一个共享目录,为了方便起见,我们将使用一个名为share的目录。使用以下命令进行创建: sudo mkdir -p /srv/samba/share…

    other 2023年6月27日
    00
  • vue-组件

    当计算小数百分比时,使用Java中的double数据类型是正确的。double数据类型可以存储小数,因此可以准确地计算小数百分比。以下是使用double数据类型计算小数百比的示例: 示例一:计算小百分比 假设我们要计算0.75的百分比,可以按照以下步骤进行设置: double decimal = 0.75; double percentage = decim…

    other 2023年5月9日
    00
  • Mybatis 如何在配置文件中给实体类起别名

    Mybatis 如何在配置文件中给实体类起别名 步骤一:在配置文件中指定别名 在 Mybatis 的配置文件中,可以通过<typeAliases>元素来为实体类指定别名。具体操作如下: 打开 Mybatis 的配置文件(通常是 mybatis-config.xml)。 在 <configuration> 标签内部添加 <type…

    other 2023年6月28日
    00
  • 成员初始化列表与构造函数体中的区别详细解析

    成员初始化列表和构造函数体都是针对类的构造函数的,它们的作用是在对象被创建时对类的成员进行初始化。 成员初始化列表 在C++11标准之前,对于类成员变量的初始化是在构造函数体中进行的,而在C++11标准之后,可以使用成员初始化列表来对成员变量进行初始化。成员初始化列表是指在构造函数的参数列表后面加上冒号“:”,接着是一系列的成员变量初始化语句。 示例1: c…

    other 2023年6月26日
    00
  • scrollview tableView嵌套解决方案示例

    ScrollView TableView嵌套解决方案示例攻略 在移动应用开发中,有时候我们需要在一个页面中同时展示可滚动的内容和表格数据。这时候,我们可以使用ScrollView和TableView进行嵌套,以实现这个需求。下面是一个详细的攻略,包含了解决方案的步骤和两个示例说明。 步骤 创建一个ScrollView作为外层容器,用于展示可滚动的内容。 在S…

    other 2023年7月28日
    00
  • SQLServer更改sa用户名的方法

    要更改SQL Server中的sa用户名,可以按照以下步骤进行: 1.以Windows管理员身份登录系统。 2.在SQL Server Management Studio中连接到目标SQL Server实例。 3.在“服务器对象”下拉列表中选择“安全性”,展开“登录名”节点,右键单击“sa”,选择“属性”选项。 4.在“通用”选项卡中,选择新的用户名,例如“…

    other 2023年6月27日
    00
  • r语言读取excel文件的3种方法

    以下是R语言读取Excel文件的3种方法的详细攻略: R语言读取Excel文件的3种方法 在R语言中,我们可以使用多种方法读取Excel文件。以下是R语言读取Excel文件的3种方法的详细说明: 1. readxl包 readxl包是R语言中一个非常常用的读取Excel文件的包。以下是使用readxl包读取Excel文件的示例: library(readxl…

    other 2023年5月7日
    00
  • vb的if和elseif

    以下是VB的if和elseif的完整攻略,包含两个示例说明: if语句 if语句是VB中最基本的条件语句,用于根据条件执行不同的代码块。以下是if语句的语法: If condition Then ‘ code to execute if condition is true End If 其中,condition是一个布尔表达式,如果为True,则执行Then…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部