ActiveX控件嵌入网页,关闭网页时报错的问题

原创 2004年07月12日 20:13:00

http://community.csdn.net/Expert/topic/3160/3160265.xml?temp=.5274317

出现你说的问题,一般来说是指针问题,很可能是资源没安全释方

你可以跟一下,是否到了 FinalRelease, 如果没到这里,那需要你在 IOleObject_Close release 接口(接口交叉引用造成不能释放),最终达到资源安全是否的目的

ATL 中对应

IOleObject_SetClientSite
IOleObject_Close

在覆盖这2个方法的时候,注意要调 CComControlBase 的相应方法
-------------------------------------------------------------------------------------------

(转)问题:在IE中ActiveX控件的WM_CREATE和WM_DESTORY处理函数没有被调用

概述

IE直到控件第一次可见的时候才创建ActiveX控件,调用WM_CREATE的处理代码。在离开或者关闭页面的时候也没有调用WM_DESTORY的处理代码。在控件大小是0*0的时候也有同样的问题。如果你在这之前(例如window.onload事件的处理代码中)访问控件的窗口或者子窗口,那么不会成功。

原因

大多数ActiveX控件框架,例如MFC和ATL,在本地激活ActiveX控件时创建控件。基于性能上的考虑,直到控件第一次可见的时候,IE才本地激活ActiveX控件。这样包含ActiveX控件的网页载入更加迅速,占用内存更少。这也使得ActiveX控件的WM_CREATE处理代码直到控件第一次可见的时候才被调用。

如果控件支持非窗口激活,那么IE会以非窗口激活方式创建控件,这样在离开或者关闭页面的时候控件的WM_DESTORY处理代码不会被调用。

解决方案

IE在初始化或者退出页面的时候会调用页面中的ActiveX控件的IOleObject::SetClientSite的实现,无论控件是否被本地激活。在初始化页面的时候,传递的指针是宿主的IOleClientSite 接口指针,在离开或者关闭页面的时候,传递的指针是空指针。可以根据这个指针来判断控件的状态,并且执行初始化或者清除的代码。

MFC

MFC对IOleObject::SetClientSite()的实现包含对虚函数COleControl::OnSetClientSite()的调用。这时候可以根据m_pClientSite是否为空指针来判断控件是被加载还是被清除。

// CMyControl 派生于COleControl.
void CMyControl::OnSetClientSite()
{
    if (m_pClientSite)
//父窗口及其大小并不重要,因为控件在本地激活时会自动重画和重新定位。
       VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0), CRect(0,0,0,0)));
    else
        DestroyWindow();
    COleControl::OnSetClientSite();
}

ATL

ATL对IOleObject::SetClientSite()的实现有一个IOleClientSite类型的参数(MFC在对IOleObject::SetClientSite()的实现中保存这个指针到COleControl::m_pClientSite),直接拿来判断就行了。同时,ATL没有重新设置控件的父窗口,所以控件需要手动进行本地激活。

// CMyControl 派生于CComControl
STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
{
    if (pClientSite)
    {
        RECT rc = {0,0,0,0};
        // Don't have access to the container's window so just use the
        // desktop. Window will be resized correctly during in-place
        // activation.
        HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc);
        _ASSERT (hWnd);
    }
    else
        ::DestroyWindow(m_hWnd);
     return IOleObjectImpl::SetClientSite (pClientSite);
}

HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
{
     // Get the container's window. _ASSERT (m_spClientSite);
     LPOLEINPLACESITE pInPlaceSite = NULL;
     HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite, (void **)&pInPlaceSite);
     _ASSERT (SUCCEEDED (hr) && pInPlaceSite);
     HWND hParent = NULL;
     hr = pInPlaceSite->GetWindow (&hParent);
     _ASSERT (SUCCEEDED (hr) && hParent);
     pInPlaceSite->Release ();
     // Set container window as our parent window
     SetParent (hParent);  < BR >      return CComControlBase::InPlaceActivate(iVerb, prcPosRect);  < BR > }

重现问题的步骤

 使用MFC 或者ATL创建一个ActiveX控件
 添加这两个消息的处理函数
 使用IE作为调试程序
 参考

ActiveX Control Containers(Internet Development SDK)
KB Q195188 PRB: ActiveX Control Window Is Not Created Until Visible in Internet Explorer
 Notes on Implementing an OLE Control Container(Kraig Brockschmidt)
Introduction to ActiveX Controls (Internet Development SDK)
Reusing MSHTML (Internet Development SDK)
用ATL和MFC来创建ActiveX控件(George Shepherd)

--------------------------------------
相关资源 http://support.microsoft.com/default.aspx?scid=kb;EN-US;195188

为了有利于保护安全性,Internet Explorer 已限制此网页运行可以访问计算机的脚本或 ActiveX控件。请单击这里获取选项

在dreamweaver的“代码”顶端你会发现并找到 http://www.w3.org/1999/xhtml" lang="en"> 这个后,在dtd">...
  • ken2002
  • ken2002
  • 2015年01月24日 20:25
  • 1881

VS2013编写嵌入网页的ATL控件1-新建和配置

前言,废话最近做一个项目需要网页打开的ATL控件作为依托,显示三维内容。网页对控件可以调用函数,并且传送信息。控件也可以给网页发送消息。 我不懂ATL控件,完全初学,弄了很久。写个blog记录一下。...
  • jean7155
  • jean7155
  • 2015年12月15日 17:19
  • 2658

把程序嵌入网页之ATL编写ActiveX[标准窗口+接受参数]

图文并茂的演示了如何使用ATL开发ActiveX控件,支持网页传参,具有独立窗口,可以像编写普通界面程序那样来编写网页控件。...
  • Sidyhe
  • Sidyhe
  • 2013年09月26日 15:25
  • 5292

C++编写ActiveX ocx控件在网页中调用失败问题

需要实现IObjectSafety接口  打“开工程名Ctl.h”在最上面添加     #include          在类中的DECLARE_DYNCREATE(C工程名Ctr...
  • li213y
  • li213y
  • 2016年01月06日 16:30
  • 205

Visual Studio2015打开界面文件时报错:“未在此计算机上注册activex控件.rar

  • 2017年11月18日 16:55
  • 12.17MB
  • 下载

网页加载ActiveX控件

我在做网页加载在ActiveX控件需要按一下步骤进行: 1.管理员权限打开终端:输入 regsvr32 xxx.ocx 2.regedit打开注册表,搜索xxx.ocx对应的uuid 3.编写测试ht...
  • a1317338022
  • a1317338022
  • 2017年12月25日 11:03
  • 56

用ATL开发和部署ActiveX网页控件

ATL,ActiveX控件,COM组件
  • xt_chaoji
  • xt_chaoji
  • 2011年03月29日 11:24
  • 749

用ATL开发ActiveX网页控件

由于业务需要,需要做一个网页插件,以前
  • liyong314159265
  • liyong314159265
  • 2014年11月10日 13:47
  • 1125

在HTML网页中使用ActiveX控件

From: http://blog.163.com/haizai219@126/blog/static/4441255520097264447968/ 1. 摘要:        在企...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2011年11月27日 21:09
  • 1666

ActiveX控件打包成Cab置于网页中自动下载安装(转载)

原文出自http://www.iteye.com/topic/110834  [背景]        做过ActiveX控件的朋友都知道,要想把自己做的ActiveX控件功能放在自己的网页上使用,...
  • zhanjianshinian
  • zhanjianshinian
  • 2013年07月30日 16:24
  • 1437
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveX控件嵌入网页,关闭网页时报错的问题
举报原因:
原因补充:

(最多只允许输入30个字)