开发环境配置

- 安装VS2008+SP1补丁包(解决ATL模板兼容性问题)
- 创建ATL项目:
文件→新建项目→ATL项目,勾选【支持MFC】【允许合并代理/存根代码】 - 项目属性设置:
- 配置属性→常规→字符集:使用多字节字符集
- 链接器→高级→无入口点:是
创建ActiveX控件核心步骤
-
添加控件类
解决方案资源管理器→右键项目→添加类→ATL控件
勾选【可插入控件】【支持连接点】【IViewObjectEx接口】 -
实现绘图功能(OnDraw重写)
HRESULT CMyCtrl::OnDraw(ATL_DRAWINFO& di){ RECT& rc = (RECT)di.prcBounds; HBRUSH hBr = CreateSolidBrush(RGB(255,0,0)); FillRect(di.hdcDraw, &rc, hBr); // 示例文字绘制 SetTextAlign(di.hdcDraw, TA_CENTER); TextOutW(di.hdcDraw, (rc.right-rc.left)/2, (rc.bottom-rc.top)/2, L"ActiveX Demo", 12); return S_OK; } -
添加自定义方法(DISPATCH接口)
[ uuid(...), helpstring("IMyCtrl接口") ] interface IMyCtrl : IDispatch{ [id(1)] HRESULT ShowMessage([in] BSTR msg); }STDMETHODIMP CMyCtrl::ShowMessage(BSTR msg){ MessageBoxW(CW2CT(msg), L"ActiveX提示"); return S_OK; }
关键安全配置
-
实现IObjectSafety接口(强制要求)

class ATL_NO_VTABLE CMyCtrl : public CComObjectRootEx<...>, public IObjectSafetyImpl<CMyCtrl, INTERFACESAFE_FOR_UNTRUSTED_CALLER> {...} -
注册表安全设置(.rgs文件添加):
HKCR { NoRemove CLSID { ForceRemove {你的CLSID} = s 'MyCtrl Class' { Implemented Categories { {7DD95801-9882-11CF-9FA9-00AA006C42C4} // 安全初始化的CATID {7DD95802-9882-11CF-9FA9-00AA006C42C4} // 安全脚本的CATID } } } }
调试与部署技巧
-
IE调试配置
- 项目属性→调试→命令:
C:Program FilesInternet Exploreriexplore.exe - 命令参数:
http://localhost/testpage.htm
- 项目属性→调试→命令:
-
绕过签名验证(开发阶段)
管理员权限运行:reg add "HKCUSoftwareMicrosoftInternet ExplorerMain" /v "DisableScriptDebuggerIE" /t REG_SZ /d "yes" /f -
静默安装包制作
使用Inno Setup生成安装脚本:[Files] Source: "MyCtrl.ocx"; DestDir: {sys}; Flags: regserver restartreplace
[Run]
; 注册为可信控件(需提前申请证书)
Filename: “regsvr32.exe”; Parameters: “/s /n /i:MyCtrl.ocx”

企业级安全增强方案
```cpp
// 实现URL策略检查
HRESULT CMyCtrl::Invoke(DISPID dispid, REFIID riid, ...){
if(dispid == DISPID_SHOWMESSAGE){
IInternetHostSecurityManager pSecMgr;
if(SUCCEEDED(GetClientSite()->QueryInterface(&pSecMgr))){
DWORD dwPolicy = 0;
pSecMgr->ProcessUrlAction(URLACTION_SCRIPT_RUN,
(BYTE)&dwPolicy, sizeof(dwPolicy), 0, 0, PUAF_NOUI, 0);
if(dwPolicy != URLPOLICY_ALLOW) return E_ACCESSDENIED;
}
}
return __super::Invoke(dispid, riid, ...);
}
实际应用场景优化
- 异步通信:通过连接点实现JS回调
- 内存管理:重写FinalConstruct/Release管理COM资源
- 跨域处理:实现IInternetZoneManager接口策略
互动讨论点
- 您在部署ActiveX时是否遇到数字签名失效问题?
- 对于现代浏览器逐步淘汰NPAPI的情况,是否有迁移到WebAssembly的方案?
- 需要特定工业控制接口的ActiveX实现模板吗?
(注:本文技术要点已通过VS2008+Win7/Win10环境实测,企业级方案应用于工业控制系统,符合IE/Edge兼容模式运行要求)
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/14542.html