Web网页中内嵌Activex的Activex插件开发

2023-10-29

转载自:

http://blog.csdn.net/tttyd/article/details/5258096

源代码下载
http://files.cnblogs.com/tttyd/Activex.rar

由于在博主的博客中没有讲明工程的创建过程与最后插件的注册方法,我在另一篇文章中作了补充:

用ATL写简单的ActiveX控件

 

介绍:
  如今在许多流媒体视频网站(youku,tudou......)我们都会发现,观看视频之前都会有一段时间的广告,甚至在观看视频途中也会插入一些广告。实现这个效果的可以有多种技术。使用Javascript就可以实现,只需要在同一个位置分别创建两个Object,一个嵌入Flash插件一个嵌入 WMP插件,然后切换显示这两个控件即可。
  使用COM/Activex技术也可以在同一个控件中实现这样的功能。

插件功能描述:

  上周在某个公司碰到这么一个问题,它们需要创建一个插件,内部嵌入一个Flash插件和Windows Media Player插件。然后写一个Web测试页面测试此Activex页面。页面上有三个输入框和一个按钮(Play)。第一个输入框输入falsh URL(.swf),第二个输入框输入.swf播放时间长度(秒),即视频广告时间,第三个输入框输入.wmv URL。点击Play按钮后,页面按钮将三个参数传递给控件,控件优先播放.swf,要布满整个控件的大小。.swf播放指定的时间之后,然后播放.wmv,wmv也要布满整个控件。

 

容器-插件基础:

为在一个窗口中嵌入一个Activex的话,就需要创建一个Container Window

然后创建被嵌入的Activex,

然后通过上述的接口建立容器与Activex直接的联系。

在ATL中使用CAxHostWindow封装了Activex容器,并进一步使用CAxWindow类来简化控件容器的操作。


Activex嵌入主要代码

1、环境设置。

 

因为用到Flash的操作接口 IShockwaveFlash,所以在工程中导入flash的组件:

#import "C:\WINDOWS\system32\Macromed\Flash\Flash32_11_3_300_257.ocx" \
	no_namespace raw_interfaces_only raw_native_types \
	named_guids exclude("IServiceProvider")


因为用到Medial Player的接口IWMPPlayer,所以在工程中导入WMP的组件:

#import "C:\\WINDOWS\\system32\\wmp.dll" no_namespace \
	raw_interfaces_only raw_native_types named_guids



2.内嵌Activex的创建

LRESULT CEmbed::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    RECT rc;
    GetWindowRect(&rc);
    rc.right -= rc.left;
    rc.bottom -= rc.top;
    rc.top = rc.left = 0;
    
    //对于ATL3.0 必须调用AtlAxWinInit,否则Create会调用失败
    AtlAxWinInit(); //初始化容器窗口的注册类
    RECT rect = rc;
    //创建Shock wave flash控件播放Flash
    TCHAR* controlName = L"ShockwaveFlash.ShockwaveFlash";
    m_FlashWin.Create(m_hWnd, rect, controlName, WS_CHILD | WS_VISIBLE, 0, ID_FLASHCTRL );
    DWORD  error = ::GetLastError();
    CComPtr< IAxWinAmbientDispatch > ambient;
    m_FlashWin.QueryHost( &ambient );
    
    CComPtr<IAxWinHostWindow> hostwin;
    m_FlashWin.QueryHost(&hostwin);
    hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrFlash.p);
    CComQIPtr<IShockwaveFlash> ptrFlash = m_ptrFlash;
    ptrFlash->put_BackgroundColor(RGB( 0, 0, 0 ) );
    //创建Windows Media Play控件播放.wmv文件
    controlName = L"WMPlayer.OCX";
    //CLSID cld;
    //::CLSIDFromProgID(controlName,&cld);
    m_WmvWin.Create(m_hWnd, rect,controlName,WS_CHILD, 0,ID_WMPCTRL);
    
    if(hostwin)
        hostwin.Release();
    m_WmvWin.QueryHost(&hostwin);
    hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrWmv.p);    
    return 0;
}


3.设置内嵌Activex控件的大小位置

HRESULT CEmbed::SetObjectRects(LPCRECT prcPos,LPCRECT prcClip)
{
    IOleInPlaceObjectWindowlessImpl<CEmbed>::SetObjectRects(prcPos, prcClip);
    int cx, cy;
    cx = prcPos->right - prcPos->left;
    cy = prcPos->bottom - prcPos->top;
    RECT rect;
    GetClientRect( &rect );
    rect.top = 0;
    rect.left = 0;
    if(m_FlashWin)
        m_FlashWin.MoveWindow(&rect );
    if(m_FlashWin)
        m_WmvWin.MoveWindow(&rect );
    return S_OK;
}


4.测试代码

4、1  在测试代码中根据CLASSID获得此ID的对象playobj,但如果在没有注册此ActiveX控件的电脑上该怎么办呢?

此时得通过来在HTML文件中指定codebase="http://url-to-my-server/myactivex.cab"寻找安装文件。

4、2   注册的dll文件中的接口只有四个,但 在script脚本函数中palyobj.SetJmpTimer(parseInt(obj.value));函数没没有出现在此DLL里。

         

       

 

<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<TITLE>内嵌Activex的Activex插件测试页</TITLE>
</HEAD>
<BODY>
<OBJECT ID="Play" CLASSID="CLSID:62762BB2-C5D5-4CAC-A17C-CABC660678F2" width=700 height=400 ></OBJECT>
<br>Flash URL:<input type=text size=45 id="urlflash" value="http://www.atfriday.com/GameZone/200471922656/20047198816907.swf">    
Time:<input type=text size=3 id="elapse" value=5>
<br>WMV URL:  <input type=text size=45 id="wmvflash" value="D://test//Embed//Embed//wmp.wmv">
<input type=button value="Play" οnclick="play()">
<script language="javascript" type="text/javascript">
function play()
{
    var obj;    
    var palyobj = document.getElementById("Play");
    obj = document.getElementById("urlflash");
    palyobj.LoadFlashMovie(obj.value);    
    obj = document.getElementById("wmvflash");
    palyobj.LoadWmvMovie(obj.value);
    obj = document.getElementById("elapse");
    palyobj.SetJmpTimer(parseInt(obj.value));
    palyobj.Play();
}
<script>
</BODY>
</HTML>

 

扩展学习:网页调用ActivX中的方法的第二种方式

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web网页中内嵌Activex的Activex插件开发 的相关文章

随机推荐

  • 【微信小程序】基础知识总结

    html view div text span bind tap click functional page navigator a 可以放到属性里做为值 wx for arr 布尔类型的false需要放在 才有效 bindinput ip
  • 史上最简单的Spring Security教程(十六):FilterSecurityInterceptor详解

    FilterSecurityInterceptor 作为 Spring Security Filter Chain 的最后一个 Filter 承担着非常重要的作用 如获取当前 request 对应的权限配置 调用访问控制器进行鉴权操作等 都
  • 使用JDBC连接数据库,进行查询操作

    1 先用创建数据库并插入数据 2 在IDEA中创建实体类 类的名字对应数据库表的名字 类的属 性对应表的字段 IDEA自动构造代码快捷键 alt insert 3 开始进行JDBC的增删改查操作 3 1 JDBC连接数据库 需要配置四大参数
  • c语言:输出一个菱形图案

    输出图案样式如下 方法 运用循环内嵌循环 通过看每一行空格与星号的关系来确定循环 外面加个循环 里面内嵌两个循环 include
  • SpringBoot中Mapper.xml的入参方式

    在SpringBoot开发过程中 我们使用 Mapper xml Mapper java 来封装对数据库表的 CURD 操作 正常每张表会有一组对应的文件 一 Mapper常见用法 下面例举一个查询操作 数据表t sap customer
  • Servlet会话技术

    会话技术 会话可以简单理解为 一个用户打开一个浏览器 在同一个WEB应用上 点击多个超链接 访问多个WEB资源 然后关闭浏览器 那这整个过程我们称之为一个会话 作用 会话技术可以保存用户在会话过程中所产生的数据 会话技术也可以让用户在同一个
  • 华为vlan的多种划分方式

    华为vlan的多种划分方式 一 VLAN概念 二 VLAN划分的方法 三 实验拓扑 四 实验的目的 五 初始化交换机配置 VLAN 以及VLAN接口跟DHCP 六 基于接口方式划分 测试 七 基于MAC的方式划分 测试 八 基于IP组播方式
  • 地下水数值模拟软件有哪些?GMS、Visual modflow、FEFLOW哪个更好用呢?

    目录 最新全套GMS地下水数值模拟 地下水环评 一级 实践技术及Modflow地下水数值模拟 地下水数值模拟软件Visual modflow Flex实践技术应用 地下水热耦合模拟FEFLOW建模实践技术应用 全流程各工程类型地下水环境影响
  • javamail发送HTML,内容中文乱码。

    编码格式的问题 改成下面这种解决问题 message setContent h1 测试 h1 text html charset gb2312 绿色字体是解决关键
  • QT中读取指定文件

    qt读取指定文件分为两步 第一步获取文件路径 第二部读取文件 文本对话框来获取路径 QString filename filename QFileDialog getOpenFileName nullptr 选择文件 nullptr 别忘记
  • 草稿

    文档信息 版权声明 自由转载 非商用 非衍生 保持署名 Creative Commons BY NC ND 3 0 博 主 lyc daniel 博主邮箱 lyc daniel 163 com
  • 怎么取消 Windows Server 2012 RDP 限制每个用户只能进行一个会话

    在 Windows Server 2008 2008 R2 上 如果希望多个远程用户使用同一个账号同时访问服务器的 Remote Desktop RDP 只需通过管理工具 远程桌面下的 远程桌面会话主机配置 进行设置即可 或是通过命令 在运
  • 关于Verilog中的几种赋值语句

    nanoty博客转载 1 连续赋值语句 Continuous Assignments 连续赋值语句是Verilog数据流建模的基本语句 用于对线网进行赋值 等价于门级描述 是从更高的抽象角度来对电路进行描述 连续赋值语句必须以关键词assi
  • 注释分析一个cusolver的官方示例:cuSolverDn_LinearSolver

    samples 7 CUDALibraries cuSolverDn LinearSolver cuSolverDn LinearSolver cpp 示例是求解如下方程 A x b where b ones m 1 根据A的不同 有三种求
  • 基于Pytorch的强化学习(DQN)之 Multi-agent 训练架构

    目录 1 引言 2 训练架构 2 1 Fully decentralized 2 2 Fully centralized 2 3 Centralized Decentralized 1 引言 我们上一次讲到了Multi agent的基本概念
  • 【Linux】网络编程 - 基础概念

    目录 一 OSI七层模型vsTCP IP五层模型 1 一些周边概念 2 OSI七层模型 3 TCP IP五层模型 4 网络传输流程图 二 什么是MAC地址 三 什么是IP IP地址 1 什么是IP 2 什么是IP地址 四 什么是端口号 一
  • 谈谈FileWriter

    FileWriter 的使用方法 使用 FileWriter 写入文件需要以下步骤 创建 FileWriter 对象 指定要写入的文件路径 使用 write String str 方法将数据写入文件中 关闭 FileWriter 对象 以下
  • BHAR事件研究方法stata代码和案例数据

    BHAR事件研究方法stata代码和案例数据 1 方法说明 BHAR Buy and Hold Abnormal Return 即购入 持有异常收益法 无论是短期事件研究 还是长期事件研究 都包含以下六大步骤 即定义事件以及事件研究窗口 选
  • java中分母为0报什么异常,分母为0一定会抛异常吗?,怎么抛异常

    分母为0一定会抛异常吗 怎么抛异常 现象描述 最近做了一个需求 用到了 预算 时间窗口数 其中预算是double类型 时间窗口数是int类型 其中时间窗口数我计算的有问题 会出现为0的情况 实际最小值应该为1 然后就出现了 一个double
  • Web网页中内嵌Activex的Activex插件开发

    转载自 http blog csdn net tttyd article details 5258096 源代码下载 http files cnblogs com tttyd Activex rar 由于在博主的博客中没有讲明工程的创建过程