该攻略需要分为两个部分:生成未签名的ActiveX控件和在IE浏览器中安装调用未签名的ActiveX控件。
生成未签名的ActiveX控件
- 在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();
}
- 将控件的DLL文件上传至一个Web服务器上,以备后续安装调用。
在IE浏览器中安装调用未签名的ActiveX控件
-
在IE浏览器中打开Web服务器上传的DDL文件所在的URL,并等待该文件下载到本地。
-
在IE浏览器的地址栏输入“about:blank”,然后按下回车键,打开一个空白页面。
-
在空白页面上右击,选择“属性”,在出现的属性窗口中找到“自定义”选项卡,然后点击“新建”按钮,在“名称”字段中输入ActiveX控件的名称,如“MyActiveXCtrl”,在“值”字段中输入控件的CLSID,如“{5C817BF0-1F30-40A1-8A9C-D57840A6078D}”。
-
在空白页面上添加一个脚本标记,用于创建和调用控件的实例。
示例代码如下:
<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>
- 保存该空白页面,并再次在IE浏览器中打开该页面,即可看到控件已经被成功安装和调用。
另一个示例:
- 在IE浏览器中输入以下代码,将未签名的ActiveX控件作为object标记插入到HTML页面中:
<object id="myactivexctrl" codebase="http://mywebserver/myactivexctrl.dll" classid="clsid:5C817BF0-1F30-40A1-8A9C-D57840A6078D"></object>
- 在JS代码中调用ActiveXObject来创建控件的实例,示例代码如下所示:
var control = new ActiveXObject("MYACTIVEXCTRL.MyActiveXCtrl.1");
document.getElementById("myactivexctrl").appendChild(control);
该攻略不建议用于在生产环境中使用,因为在实际部署时,未签名的ActiveX控件会对系统安全性带来潜在的风险。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何才能让IE浏览器安装调用未签名的ActiveX控件 - Python技术站