博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Web网页中内嵌Activex的Activex插件开发 .
阅读量:6943 次
发布时间:2019-06-27

本文共 5870 字,大约阅读时间需要 19 分钟。

转载自:

源代码下载

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

 

介绍:

  如今在许多流媒体视频网站(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的组件:

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

[cpp]
  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的创建

[cpp]
  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.       
  9.     //对于ATL3.0 必须调用AtlAxWinInit,否则Create会调用失败   
  10.     AtlAxWinInit(); //初始化容器窗口的注册类   
  11.     RECT rect = rc;  
  12.     //创建Shock wave flash控件播放Flash   
  13.     TCHAR* controlName = L"ShockwaveFlash.ShockwaveFlash";  
  14.     m_FlashWin.Create(m_hWnd, rect, controlName, WS_CHILD | WS_VISIBLE, 0, ID_FLASHCTRL );  
  15.     DWORD  error = ::GetLastError();  
  16.     CComPtr< IAxWinAmbientDispatch > ambient;  
  17.     m_FlashWin.QueryHost( &ambient );  
  18.       
  19.     CComPtr<IAxWinHostWindow> hostwin;  
  20.     m_FlashWin.QueryHost(&hostwin);  
  21.     hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrFlash.p);  
  22.     CComQIPtr<IShockwaveFlash> ptrFlash = m_ptrFlash;  
  23.     ptrFlash->put_BackgroundColor(RGB( 0, 0, 0 ) );  
  24.     //创建Windows Media Play控件播放.wmv文件   
  25.     controlName = L"WMPlayer.OCX";  
  26.     //CLSID cld;   
  27.     //::CLSIDFromProgID(controlName,&cld);   
  28.     m_WmvWin.Create(m_hWnd, rect,controlName,WS_CHILD, 0,ID_WMPCTRL);  
  29.       
  30.     if(hostwin)  
  31.         hostwin.Release();  
  32.     m_WmvWin.QueryHost(&hostwin);  
  33.     hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrWmv.p);      
  34.     return 0;  
  35. }  
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
hostwin; m_FlashWin.QueryHost(&hostwin); hostwin->QueryControl(__uuidof(IDispatch),(void**)&m_ptrFlash.p); CComQIPtr
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控件的大小位置

[cpp]
  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
::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里。

         

       

 

[cpp]
  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" οnclick="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>  
内嵌Activex的Activex插件测试页
Flash URL: Time:
WMV URL:

 

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

 

你可能感兴趣的文章
WebAPI性能优化之压缩解压
查看>>
jquery获取下拉框中的循环值
查看>>
HTML5 一些有用的 APIs
查看>>
Unity获取指定资源目录下的所有文件
查看>>
C - The C Answer (2nd Edition) - Exercise 1-12
查看>>
linux定时任务cron 安装配置
查看>>
SequenceFile文件
查看>>
人脸和性别识别(基于OpenCV)
查看>>
Nginx Java 日志切割脚本
查看>>
浅谈代码审计入门实战:某博客系统最新版审计之旅
查看>>
nyoj 119士兵杀敌(三)(线段树区间最值查询,RMQ算法)
查看>>
truncate/drop表非常慢,怎么办?用硬链接,极速体验
查看>>
spring boot测试
查看>>
Timer使用
查看>>
H5+混合移动app应用开发——坑我太甚
查看>>
nc/netcat命令
查看>>
web3.js编译Solidity,发布,调用全部流程(手把手教程)
查看>>
Java国际化号码验证方法,国内手机号正则表达式
查看>>
HDU 1158 Employment Planning
查看>>
表格内嵌编辑控件
查看>>