介绍:
如今在许多流媒体视频网站(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.内嵌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;
}
2.设置内嵌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;
}
3.测试代码
<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>
源代码下载
http://files.cnblogs.com/tttyd/Activex.rar
106 个解决方案
#1
sf
顶。
顶。
#2
沙发 & jf
#3
sf,请大家多多指教
#4
楼主是专攻流媒体的?
#5
#6
有这意思,但没环境
兄弟们多多指教,多交流交流
#7
接分!
#8
mark
#9
丿,up up
#10
学习
#11
学习
#12
顶
#13
不错的东西
#14
写的不错
写的不错
写的不错
写的不错
写的不错
#15
好好学习,天天向上
#16
收藏了
#17
!!!
#18
COM初学者围观!
#19
试试看,自动发帖
#20
楼主,你的activex控件,最后发布时候是不是要数字签名加打包呀?这部分工作你是如何做到?
#21
强烈收藏!
#22
学习收藏。
#23
jf
#24
关于打包不是这个主题的重点。
一般控件要在网络中发布都需要数字签名打包的,相关的工作可以google。
#25
ding
#26
ding
#27
是不是少了个东西 编译出错啊
#28
需要安装Shock wave Flash 10版本插件
和Windows Media Player插件
这里Flash10b.ocx根据你当前系统的版本而定,可以换成flash.ocx或其他
#import "C:\WINDOWS\system32\Macromed\Flash\Flash10b.ocx" \
no_namespace raw_interfaces_only raw_native_types \
named_guids exclude("IServiceProvider")
#import "C:\\WINDOWS\\system32\\wmp.dll" no_namespace \
raw_interfaces_only raw_native_types named_guids
#29
学习中!
#30
Mark
#31
正在学习当中
谢了
谢了
#32
UP, 接分
#33
楼主牛叉,弱弱问一句:在html代码里哪里体现了调用active x控件?
#34
学习了!!!
#35
wu~~~
#36
AAA
#37
路过,看过
#38
看不明白
#39
adfasd
#40
收藏了
#41
up
#42
<OBJECT ID="Play" CLASSID="CLSID:62762BB2-C5D5-4CAC-A17C-CABC660678F2" width=700 height=400 ></OBJECT>
<script language="javascript" type="text/javascript">
function play()
{
var obj;
var palyobj = document.getElementById("Play");
.....
palyobj.LoadFlashMovie(obj.value);
.....
palyobj.LoadWmvMovie(obj.value);
.....
palyobj.SetJmpTimer(parseInt(obj.value));
palyobj.Play();
}
</script>
#43
留足迹!
#44
收藏!
#45
哦哦
#46
纯纯的接分。
#47
楼主,COM组件在WEB上已经不流行了。安全性只是一方面,谁希望自己的访问者限于WINDOWS?
#48
学习~~
#49
#50
哦哦
#1
sf
顶。
顶。
#2
沙发 & jf
#3
sf,请大家多多指教
#4
楼主是专攻流媒体的?
#5
#6
有这意思,但没环境
兄弟们多多指教,多交流交流
#7
接分!
#8
mark
#9
丿,up up
#10
学习
#11
学习
#12
顶
#13
不错的东西
#14
写的不错
写的不错
写的不错
写的不错
写的不错
#15
好好学习,天天向上
#16
收藏了
#17
!!!
#18
COM初学者围观!
#19
试试看,自动发帖
#20
楼主,你的activex控件,最后发布时候是不是要数字签名加打包呀?这部分工作你是如何做到?
#21
强烈收藏!
#22
学习收藏。
#23
jf
#24
关于打包不是这个主题的重点。
一般控件要在网络中发布都需要数字签名打包的,相关的工作可以google。
#25
ding
#26
ding
#27
是不是少了个东西 编译出错啊
#28
需要安装Shock wave Flash 10版本插件
和Windows Media Player插件
这里Flash10b.ocx根据你当前系统的版本而定,可以换成flash.ocx或其他
#import "C:\WINDOWS\system32\Macromed\Flash\Flash10b.ocx" \
no_namespace raw_interfaces_only raw_native_types \
named_guids exclude("IServiceProvider")
#import "C:\\WINDOWS\\system32\\wmp.dll" no_namespace \
raw_interfaces_only raw_native_types named_guids
#29
学习中!
#30
Mark
#31
正在学习当中
谢了
谢了
#32
UP, 接分
#33
楼主牛叉,弱弱问一句:在html代码里哪里体现了调用active x控件?
#34
学习了!!!
#35
wu~~~
#36
AAA
#37
路过,看过
#38
看不明白
#39
adfasd
#40
收藏了
#41
up
#42
<OBJECT ID="Play" CLASSID="CLSID:62762BB2-C5D5-4CAC-A17C-CABC660678F2" width=700 height=400 ></OBJECT>
<script language="javascript" type="text/javascript">
function play()
{
var obj;
var palyobj = document.getElementById("Play");
.....
palyobj.LoadFlashMovie(obj.value);
.....
palyobj.LoadWmvMovie(obj.value);
.....
palyobj.SetJmpTimer(parseInt(obj.value));
palyobj.Play();
}
</script>
#43
留足迹!
#44
收藏!
#45
哦哦
#46
纯纯的接分。
#47
楼主,COM组件在WEB上已经不流行了。安全性只是一方面,谁希望自己的访问者限于WINDOWS?
#48
学习~~
#49
#50
哦哦