• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 关于在网页中activex的创建时间问题

关于在网页中activex的创建时间问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了网页阻止activex,360网页阻止activex,网页打印activex控件,网页阻止activex控件,网页提示activex控件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于在网页中activex的创建时间问题
描述:

<OBJECT ID="ff" CLASSID="CLSID:40ACFC39-4AED-43A0-AA82-72FAA1135DFB" width = 400 height=400></OBJECT>
<script language = "javascript">
ff.dd();
</script>
对于如上的代码,ff.dd()会在控件中中oncreate之前被调用,这个十分麻烦.
因为ff.dd()的调用会改变界面.有什么方法让一个activex彻底的先初始化完成.
然后我再调相关的方法


解决方案1:

问题:在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) 


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ActiveX在网页中不能显示Dialog的问题
  • 嵌在网页里的ACTIVEX控件不能销毁的问题。
  • activex在网页中的问题
  • 哪里有开发用于嵌入网页的activex的教程?
  • Activex的网页中,如何做到分栏
  • 请教activex网页显示问题
  • 关于网页中的Activex控件的右键菜单问题
  • 关于activex网页调用的问题,急死了!!!!!!!!!!!!!!!!!!!!111
  • ActiveX控件可不可以用newActiveXObject方式在网页中创建
  • Activex控件事件无法通知网页?有谁知道为什么啊?

相关文章

  • 2017-06-04 atlcom方法中调用c++类,返回错误的问题
  • 2017-06-05 EnterCriticalSection后,如果边续2次LeaveCriticalSection,会出现什么问题?
  • 2017-06-05 我想得到当前进程打开的所有文件句柄
  • 2017-06-05 入口函数wWinMain和WinMain?在线等
  • 2017-06-04 mfc数据库用户名和密码别对失败,求解!
  • 2017-06-05 Acitvex控件编译连接是无法注册
  • 2017-06-04 大家给点意见,开发一个2D的游戏界面!现时流行都用什么开发,direct3D吗??
  • 2017-06-05 请问如何在界面线程里定时?
  • 2017-06-05 帮我看看吧(一天没解决了),一个dll参数的问题????
  • 2017-06-04 如何在一个自定义的控件上放一个WEB控件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ADO连接SQL数据库时Link出错:errorLNK2001:unresolvedexternalsymbol_main
    • 在2000下怎样终止不能以PROCESS_TERMINATE方式OpenProcess的进程?
    • 关于PDF文件加密的问题?
    • dll的头文件的问题(在线等)?
    • IE8中我的ActiveX控件调用Flash控件失败,IE7中可以,什么原因啊?
    • CComPtr使用的问题
    • ACTIVEX控件从_variant_t中读取字节流
    • 第一次发现这个怪问题,大家来看看关于EnumChildWindows的回调函数的
    • 关于接收IE事件
    • 请问VB编写的ActiveXDLL在VC++中如何调用?我使用了Project->AddtoProject

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有