转载自:

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. lightOJ 1317 Throwing Balls into the Baskets

    lightOJ  1317  Throwing Balls into the Baskets(期望)  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/ ...

  2. 基础算法-查找:线性索引查找(I)

    前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集可能有惊人的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数 ...

  3. 使用yum来下载RPM包而不进行安装

    1. 安装yum-downloadonly. yum-utils 或 yum-plugin-downloadonly 软件包 (RHEL5) # yum install yum-downloadonl ...

  4. [LeetCode]题解(python):024-Swap Nodes in Pairs

    题目来源: https://leetcode.com/problems/swap-nodes-in-pairs/ 题意分析: 给定一个链表,每两个相邻节点就行交换.比如1->2->3-&g ...

  5. 深入浅出—JAVA(10)

    10.数字与静态 静态变量是共享的.同一类所有的实例共享一份静态变量. 实例变量:每个实例一个.静态变量:每个类一个. 数字的格式化 唯一必填的项目是类型 package xiao;class Sta ...

  6. 高级UNIX环境编程7 进程

    每个程序都会收到一张环境表 extern char **environ; c程序的存储空间布局: 正文段:共享,只读 初始化数据段:存函数以外的赋值 非初始化数据段(bbs):block starte ...

  7. TCP之超时和重传

    RTT:往返时间:  RTO:Retransmission Timeout即超时重传时间: 关键点在于:超时和重传间隔的策略,即怎样确定超时间隔和重传间隔: TCP中的四个定时器:2MSL定时器:重传 ...

  8. 【linux】 linux gpio操作

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  9. for(;;)和 while(1) 有什么区别吗?for()和while()的使用情景。

    1 for(;;)和 while(1) 有什么区别吗? void main(void) { ; // for(;;) ) { a++; } } arm-linux-gcc -c -o for.o fo ...

  10. UIAlertView、UIActionSheet兼容iOS8

    链接地址:http://blog.csdn.net/nextstudio/article/details/39959895?utm_source=tuicool 1.前言 iOS8新增了UIAlert ...