转载自:

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. chown命令详解

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  2. day1作业脚本

    1.编写登录接口: - 输入用户名和密码 - 认证成功后显示欢迎信息 - 输错三次后锁定 2.编写多级菜单 - 三级菜单 - 可依次进入子菜单 第一次写python脚本,因为没有学到函数,所以写的有点 ...

  3. poj 2309

    http://poj.org/problem?id=2309//找规律 可以看到每个根节点都可以将其在同一层的最左边的根节点整除,并且最大值为该节点加上最左边的节点值-1,最小值为////为该节点减去 ...

  4. 宣布正式发布 Biz Talk Services、Azure Active Directory 和 Traffic Manager, 同时发布 Azure Active Directory 高级版预览

    除经济优势之外,云计算还在可转化为竞争优势的应用程序开发方面提供了更大的灵活性.我们很高兴看到每天创建的新 Windows Azure 订阅超过 1000 个,更令人兴奋的是,有一半客户使用价值更高的 ...

  5. 复习知识点:XML解析数据,JOSN解析数据,GET请求数据,POST请求数据

    GDataXMLDocument-XML解析 #pragma mark - ======== Dom XML解析 - (IBAction)domParserActionXML_Document:(id ...

  6. STL vector使用方法介绍

    介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  7. 密钥登录linux

    一.linux 主机A登录linux主机B 在/etc/hosts文件下加入:(做硬解析) 192.168.1.60 u60 #设置u60为主机名 在节点A上创建RSA秘钥:(A上生成A主机密钥) # ...

  8. ftp上传错误

    明明设置好了权限,但是在上传的时候提示如下错误,但在使用的过程当中,发现有的时候是可以上传的,很奇怪的问题. baidu 了一下,发现是下面的这个设置导致的.改过来后,果然正常. 这个设置只是一个字符 ...

  9. 【Web】HttpServletRequest request 相关方法 得到路径

    username=qqqq password=wwww //----------------------POST-------------------> http://192.168.1.211 ...

  10. 【Eclipse】Tomcat 改变发布路径

    关闭服务,删除里面的所有项目,clean,然后双击服务,发布路径修改就可以点击了.当重新发布了项目后,发布路径修改的按钮又会恢复不可点击状态.