社区
ATL
帖子详情
activex 如何激活网页的某一函数?
匪六哥
2003-11-14 02:01:59
本人做了一控件,首先弹出登陆对话框,对用户进行身份认证,合法之后,需从网页上传递一参数进来,运行其它部分,现在我不知道身份合法之后如何激活网页上传递参数的这一函数,请高手指教!
...全文
89
5
打赏
收藏
activex 如何激活网页的某一函数?
本人做了一控件,首先弹出登陆对话框,对用户进行身份认证,合法之后,需从网页上传递一参数进来,运行其它部分,现在我不知道身份合法之后如何激活网页上传递参数的这一函数,请高手指教!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
icelight
2003-12-25
打赏
举报
回复
使用事件的优点是这个控件可用于IE以外的容器,例如Delphi写的容器。
所以我比较倾向于在控件中写个连接点,在JavaScript中指定event="onEvent1()。
牛兄的做法是直接找到IE的BROWSER对象指针,也就令该控件只能在IE中使用了。
triout
2003-12-22
打赏
举报
回复
http://www.csdn.net/Develop/read_article.asp?id=22859
triout
2003-12-22
打赏
举报
回复
或许因为第一次,所以觉得麻烦,自己亲自动手一下,感觉也不是很难:
1——
给接口添加一个方法:
方法名:SetClientSite
参数:IOleClientSite* pClientSite
2——
给上面的方法加以实现(在相应的类中实现,已经自动生成了框架):
STDMETHODIMP CIrDav::SetClientSite(IOleClientSite * pClientSite)
{
// TODO: 在此添加实现代码
HRESULT hr = S_OK;
IServiceProvider *isp, *isp2 = NULL;
if (!pClientSite)
{
COMRELEASE(m_spBrowser);
}
else
{
try
{
hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp));
if (FAILED(hr))
throw("");
hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
if (FAILED(hr))
throw("");
hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&m_spBrowser));
if (FAILED(hr))
throw("");
hr=this->m_spBrowser->get_Document((IDispatch**)&m_spDoc);
if(FAILED(hr))
throw("");
}
catch(LPCTSTR lpszErr)
{
if(CString(lpszErr)!="")
MessageBox(lpszErr);
hr=S_OK;
}
catch(...)
{
MessageBox("未知错误");
hr=S_OK;
}
COMRELEASE(isp);
COMRELEASE(isp2);
}
return hr;
}
通过这步的操作,我们就获得了控件所在Web页面的BROWSER对象指针和相应的DOCUMENT对象指针。
通过这些BROWSER和DOCUMENT对象指针,我们可以设置窗口的很多属性,比如菜单、全屏、工具栏等的显示和DOCUMENT的背景颜色等等。
这个方法参见MSDN:http://support.microsoft.com/support/kb/articles/Q257/7/17.ASP
3——
获得脚本,通过m_spDoc(DOCUMENT对象)的方法get_Script可以获得页面中的脚本对象:
CComPtr<IDispatch> pScript;
hr=this->m_spDoc->get_Script(&pScript);
4——
检索函数,使用上面脚本对象的GetIDsOfNames可以获取页面之中指定名的脚本函数的指针:
CComBSTR bstrMember("calert");
DISPID dispid;
hr=pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
5——
调用脚本对象的Invoke方法执行脚本函数:
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = 2;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];
for( int i = 0; i < 2; i++)
{
CComBSTR bstr = "111"; // back reading
bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
dispparams.rgvarg[i].vt = VT_BSTR;
}
dispparams.cNamedArgs = 0;
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1; // initialize to invalid arg
hr = pScript->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
这里的执行中我随意的写了几个参数,可以根据自己需要修改。
本示例的触发:打开相应的HTM页面,点击发送按钮,按钮调用脚本函数btn,btn调用了COM中的函数KeyPress函数,在KeyPress函数中获取calert函数并调用。
注:一个问题:
获得BROWSER对象是在SetClientSite函数中实现,这个函数我了解不多,我想应该是系统自动运行的函数之一,但当我使用这个函数后,原先我在COM中定义的事件(比如CLICK事件)不能响应。有高手介绍说放置在别的地方,我想应该是可以的,比如找一个COM就绪的函数进行处理,但不知IOleClientSite*pClientSite又该如何获得。
源程序不是很好,已经发送到你们邮箱,请查收。
triout
2003-12-17
打赏
举报
回复
UP
conning333
2003-11-18
打赏
举报
回复
<script language=javascript for="activexid" event="onEvent1()">
handler1()
</script>
IE下自动
激活
ActiveX
控件
本文介绍了在Internet Explorer中
ActiveX
控件的工作原理,特别是控件
激活
的过程及其实现方法。文中还探讨了控件
激活
对辅助工具和宿主WebBrowser控件应用程序的影响。
激活
ActiveX
控件
本文介绍了在Internet Explorer中如何处理
ActiveX
控件的
激活
过程,包括控件
激活
的方法、编程判断控件
激活
状态的方式以及控件
激活
对辅助工具和WebBrowser控件的影响。
使用
ActiveX
控件开发
网页
常见的问题
本文介绍了
ActiveX
控件的基本概念,包括其用途、开发工具、安装流程、版本控制及许可权问题等内容。同时列举了一些常用的
ActiveX
控件,并说明了如何在
网页
中使用这些控件。
Activex
感知
网页
关闭事件
本文探讨了Internet Explorer如何处理
ActiveX
控件的创建与销毁过程。特别关注控件在首次可见时才被创建的问题,以及如何通过IOleObject::SetClientSite方法来判断控件状态并执行相应的初始化或清理操作。
【转】
激活
ActiveX
控件
本文阐述了在Internet Explorer中
ActiveX
控件的加载及
激活
流程,解释了控件何时需要用户
激活
才能进行交互,以及如何通过编程手段避免这一过程。此外,还探讨了这一机制对辅助工具和自定义WebBrowser控件的影响。
ATL
3,248
社区成员
48,530
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章