转载自:

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的组件:

  1. #import "C:\WINDOWS\system32\Macromed\Flash\Flash32_11_3_300_257.ocx" \
  2. no_namespace raw_interfaces_only raw_native_types \
  3. named_guids exclude("IServiceProvider")
#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的组件:

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

2.内嵌Activex的创建

  1. LRESULT CEmbed::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  2. {
  3. RECT rc;
  4. GetWindowRect(&rc);
  5. rc.right -= rc.left;
  6. rc.bottom -= rc.top;
  7. rc.top = rc.left = 0;
  8. //对于ATL3.0 必须调用AtlAxWinInit,否则Create会调用失败
  9. AtlAxWinInit(); //初始化容器窗口的注册类
  10. RECT rect = rc;
  11. //创建Shock wave flash控件播放Flash
  12. TCHAR* controlName = L"ShockwaveFlash.ShockwaveFlash";
  13. m_FlashWin.Create(m_hWnd, rect, controlName, WS_CHILD | WS_VISIBLE, 0, ID_FLASHCTRL );
  14. DWORD  error = ::GetLastError();
  15. CComPtr< IAxWinAmbientDispatch > ambient;
  16. m_FlashWin.QueryHost( &ambient );
  17. CComPtr<IAxWinHostWindow> hostwin;
  18. m_FlashWin.QueryHost(&hostwin);
  19. hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrFlash.p);
  20. CComQIPtr<IShockwaveFlash> ptrFlash = m_ptrFlash;
  21. ptrFlash->put_BackgroundColor(RGB( 0, 0, 0 ) );
  22. //创建Windows Media Play控件播放.wmv文件
  23. controlName = L"WMPlayer.OCX";
  24. //CLSID cld;
  25. //::CLSIDFromProgID(controlName,&cld);
  26. m_WmvWin.Create(m_hWnd, rect,controlName,WS_CHILD, 0,ID_WMPCTRL);
  27. if(hostwin)
  28. hostwin.Release();
  29. m_WmvWin.QueryHost(&hostwin);
  30. hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrWmv.p);
  31. return 0;
  32. }
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控件的大小位置
  1. HRESULT CEmbed::SetObjectRects(LPCRECT prcPos,LPCRECT prcClip)
  2. {
  3. IOleInPlaceObjectWindowlessImpl<CEmbed>::SetObjectRects(prcPos, prcClip);
  4. int cx, cy;
  5. cx = prcPos->right - prcPos->left;
  6. cy = prcPos->bottom - prcPos->top;
  7. RECT rect;
  8. GetClientRect( &rect );
  9. rect.top = 0;
  10. rect.left = 0;
  11. if(m_FlashWin)
  12. m_FlashWin.MoveWindow(&rect );
  13. if(m_FlashWin)
  14. m_WmvWin.MoveWindow(&rect );
  15. return S_OK;
  16. }
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里。

  1. <HTML>
  2. <HEAD>
  3. <meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
  4. <TITLE>内嵌Activex的Activex插件测试页</TITLE>
  5. </HEAD>
  6. <BODY>
  7. <OBJECT ID="Play" CLASSID="CLSID:62762BB2-C5D5-4CAC-A17C-CABC660678F2" width=700 height=400 ></OBJECT>
  8. <br>Flash URL:<input type=text size=45 id="urlflash" value="http://www.atfriday.com/GameZone/200471922656/20047198816907.swf">
  9. Time:<input type=text size=3 id="elapse" value=5>
  10. <br>WMV URL:  <input type=text size=45 id="wmvflash" value="D://test//Embed//Embed//wmp.wmv">
  11. <input type=button value="Play" onclick="play()">
  12. <script language="javascript" type="text/javascript">
  13. function play()
  14. {
  15. var obj;
  16. var palyobj = document.getElementById("Play");
  17. obj = document.getElementById("urlflash");
  18. palyobj.LoadFlashMovie(obj.value);
  19. obj = document.getElementById("wmvflash");
  20. palyobj.LoadWmvMovie(obj.value);
  21. obj = document.getElementById("elapse");
  22. palyobj.SetJmpTimer(parseInt(obj.value));
  23. palyobj.Play();
  24. }
  25. <script>
  26. </BODY>
  27. </HTML>
<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" onclick="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中的方法的第二种方式

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

  1. 第03篇. 标准Web项目Jetty9内嵌API简单启动

    一直以来,想改变一些自己早已经习惯的事情. 到了一定年龄,便要学会寡言,每一句话都要有用,有重量. 喜怒不形于色,大事淡然,有自己的底线. --胖先生 昨天,简单的说了一下关于Jetty9的配置,大家 ...

  2. Unity中内嵌网页插件UniWebView

    一.常见Unity中内嵌网页实现方式: 1.UnityWebCore只支持windows 2.Unity-Webview支持Android,IOS 3.UniWebView支持mac os,Andro ...

  3. APP中内嵌H5页面为什么不能下载?

    在APP中内嵌H5页面,若页面上存在下载链接,没有任何反应,为什么呢? 原因是app中内嵌的H5页面是WebView解析的,什么是WebView呢? 在Android手机中内置了一款高性能webkit ...

  4. 【转】WebResource实现在自定义控件中内嵌JS文件

    在类库中的资源  其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发 ...

  5. C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>中介绍了目前市场主流 ...

  6. web网页中使用vlc插件播放相机rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...

  7. Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages

    Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages Web网页中动态数据区域的识别 ...

  8. Unity中内嵌网页插件UniWebView使用总结

    目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1.  UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject. 2.  Un ...

  9. Winform/WPF中内嵌BeetleX的HTTP服务

    在新版本的BeetleX.FastHttpApi加入了对netstandard2.0支持,如果程序基于.NetFramework4.6.1来构建WinForm或WPF桌面程序的情况下可以直接把Beet ...

随机推荐

  1. Eclipse使用笔记

    eclipse内容辅助键 alt+ /用法: Alt+/ 提示作用 帮助补齐一些东西,还可以帮助你起名字, main+alt+/,syso+alt+/ alt+shift+s给出一些快捷操作,比如fo ...

  2. 五毛的cocos2d-x学习笔记04-触摸点

    Touch position是屏幕坐标系中的点,OpenGL position是cocos2d-x用到的OpenGL坐标系上的点坐标.所以就需要将touch的坐标转换成OpenGL坐标系中的点坐标. ...

  3. 新到的Mac配置Java开发环境

    今天Mac到手,需要配置一些用到的开发环境,在这里做一些纪录. 1. 下载Eclipse,地址:http://www.eclipse.org/downloads/,因为个人需求,所以下载的是Java ...

  4. jquery事件链式写法

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  5. [LeetCode]题解(python):015-3Sum

    题目来源: https://leetcode.com/problems/3sum/ 题意分析: 这道题目是输入一个数组nums.找出所有的3个数使得这3个数之和为0.要求1.输出的3个数按小到大排序, ...

  6. net core 静态文件

    asp.net core 之静态文件目录的操作   文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努 ...

  7. Qt下如何修改文件的时间(全平台修改)

    提供一个全平台修改文件的时间的方法,希望大家喜欢 /* UTIME.C: This program uses _utime to set the * file-modification time to ...

  8. cpu有哪些架构

    原文:http://blog.csdn.net/wyzxg/article/details/5027738 author:skatetime:2009/12/17 这几天在下载RPM包的时候,总会看见 ...

  9. poco vs Boost

    Wooce Yang收集整理 POCO的优点: 1) 比boost更好的线程库,特别是一个活动的方法的实现,并且还可设置线程的优先级. 2) 比 boost:asio更全面的网络库.但是boost:a ...

  10. ckeditor3.4.2是否升级为4.2.1的问题

    ckeditor官网访问地址: http://ckeditor.com/demo 目前公司项目中用到富文本编辑器基本都是cheditor3.4.2, 在不修改其源码的情况下,不兼容于IE10,具体见& ...