内嵌Activex的Activex插件开发

雪影 2010-01-26 03:08:16
加精
http://www.cnblogs.com/tttyd/articles/1656744.html

介绍:
  如今在许多流媒体视频网站(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
...全文
4219 106 打赏 收藏 转发到动态 举报
写回复
用AI写文章
106 条回复
切换为时间正序
请发表友善的回复…
发表回复
heisenberg07 2012-09-23
  • 打赏
  • 举报
回复
非常详细,我想在ActiveX再嵌入个webBrowser,不知行不?
mainsea 2011-09-27
  • 打赏
  • 举报
回复
额,楼主很强悍啊
caizhenzhou 2011-02-21
  • 打赏
  • 举报
回复
这个真是好东西!!!
ydxitxdx 2010-11-25
  • 打赏
  • 举报
回复
我来的好晚啊。。。。。多多请教
truedada 2010-07-13
  • 打赏
  • 举报
回复
可以下载 正在学习...
雪影 2010-02-25
  • 打赏
  • 举报
回复
引用 97 楼 hookme 的回复:
http://files.cnblogs.com/tttyd/Activex.rar
代码地址好像无效了啊!

代码地址没问题的,可以下载的
dazzle01 2010-02-24
  • 打赏
  • 举报
回复
http://files.cnblogs.com/tttyd/Activex.rar
代码地址好像无效了啊!

顶一下,望解决
hookme 2010-02-20
  • 打赏
  • 举报
回复
http://files.cnblogs.com/tttyd/Activex.rar
代码地址好像无效了啊!
hookme 2010-02-20
  • 打赏
  • 举报
回复
引用楼主 tttyd 的回复:
http://www.cnblogs.com/tttyd/articles/1656744.html

介绍:
  如今在许多流媒体视频网站(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也要布满整个控件。
<img src="http://images.cnblogs.com/cnblogs_com/tttyd/230811/FlashPlay.jpg" alt="" />
容器-插件基础:

 为在一个窗口中嵌入一个Activex的话,就需要创建一个Container Window,然后创建被嵌入的Activex,然后通过上述的接口建立容器与Activex直接的联系。在ATL中使用CAxHostWindow封装了Activex容器,并进一步使用CAxWindow类来简化控件容器的操作。

Activex嵌入主要代码

1.内嵌Activex的创建
C/C++ codeLRESULT 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);return0;
}
2.设置内嵌Activex控件的大小位置
C/C++ codeHRESULT 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 code<HTML><HEAD><metahttp-equiv="Content-Type" content="text/html; charset=gb2312"/><TITLE>内嵌Activex的Activex插件测试页</TITLE></HEAD><BODY><OBJECTID="Play" CLASSID="CLSID:62762BB2-C5D5-4CAC-A17C-CABC660678F2" width=700height=400></OBJECT><br>Flash URL:<inputtype=textsize=45id="urlflash" value="http://www.atfriday.com/GameZone/200471922656/20047198816907.swf">
Time:<inputtype=textsize=3id="elapse" value=5><br>WMV URL:<inputtype=textsize=45id="wmvflash" value="D:\\test\\Embed\\Embed\\wmp.wmv"><inputtype=buttonvalue="Play" onclick="play()"><scriptlanguage="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


不错,有图,很容易明白!
mgl123 2010-02-01
  • 打赏
  • 举报
回复
顶,真的很不错呀,很需要
李董 2010-01-31
  • 打赏
  • 举报
回复
没看懂 %>_<%
yyfisyyf 2010-01-30
  • 打赏
  • 举报
回复
学习
uusy99 2010-01-30
  • 打赏
  • 举报
回复
mark
activex还是挺有用途的!
guoyanjie3 2010-01-30
  • 打赏
  • 举报
回复
activex
skyaspnet 2010-01-30
  • 打赏
  • 举报
回复
厉害,学习
zhuoyue 2010-01-29
  • 打赏
  • 举报
回复
mark
「已注销」 2010-01-29
  • 打赏
  • 举报
回复


JF
wodespace 2010-01-28
  • 打赏
  • 举报
回复
学习啦
xylicon 2010-01-28
  • 打赏
  • 举报
回复
谢谢分享。有空拜读一下。
leer168 2010-01-28
  • 打赏
  • 举报
回复
hao thank you
加载更多回复(75)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧