JS调用BHO
// BHO 中添加下面的函数,设置UIHandler
// BHO 包含如下成员变量:
// CDocDispatch m_docDispatch;
// CComPtr<IDocHostUIHandler> m_spDefaultDocHostUIHandler;
// CComPtr<IOleCommandTarget> m_spDefaultOleCommandTarget;
HRESULT CBHO::SetDocHostUIHandler(IDispatch *pWebBrowser)
{
HRESULT hr = S_OK; if(NULL == pWebBrowser){
hr = S_FALSE;
}
else{
CComQIPtr<IWebBrowser2> spTempWebBrowser = pWebBrowser;
// only deal with the main window
if (spTempWebBrowser && m_spWebBrowser && m_spWebBrowser.IsEqualObject(spTempWebBrowser))
{
CComPtr<IDispatch> spDispDoc = NULL;
hr = spTempWebBrowser->get_Document(&spDispDoc);
if (SUCCEEDED(hr) && NULL != spDispDoc)
{
CComQIPtr<IHTMLDocument2> spDoc2 = spDispDoc;
if (spDoc2)
{
// Request default handler from MSHTML client site
CComQIPtr<IOleObject> spOleObject = spDispDoc;
if (spOleObject)
{
CComPtr<IOleClientSite> spClientSite = NULL;
hr = spOleObject->GetClientSite(&spClientSite);
if (SUCCEEDED(hr) && spClientSite)
{
m_spDefaultDocHostUIHandler = spClientSite;
m_spDefaultOleCommandTarget = spClientSite;
}
}
// Set the new custom IDocHostUIHandler
CComQIPtr<ICustomDoc> spCustomDoc = spDoc2;
if (spCustomDoc)
{
hr = spCustomDoc->SetUIHandler(this);
}
}
}
}
}
return hr;
}
在CBHO::Invoke中调用上面的函数
... ...
switch (dispidMember)
{
case DISPID_NAVIGATECOMPLETE2:
{
IDispatch* pDisp = pDispParams->rgvarg[1].pdispVal;
SetDocHostUIHandler(pDisp);
}
break;
}
... ...
CBHO实现IID_IDocHostUIHandler::GetExternal接口
HRESULT STDMETHODCALLTYPE CBHO::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
{
*ppDispatch = (IDispatch*)(&m_docDispatch);
return S_OK;
}
CBHO::SetSite中设置m_docDispatch
STDMETHODIMP CBHO::SetSite(IUnknown* pUnkSite)
{
if (pUnkSite != NULL)
{
pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
if (m_spWebBrowser)
{
m_docDispatch.SetSite(this);
... ...
}
}
else
{
m_docDispatch.SetSite(NULL);
... ...
} ... ...
return IObjectWithSiteImpl<CBHOMain>::SetSite(pUnkSite);
}
实现CDocDispatch::GetIDsOfNames
HRESULT STDMETHODCALLTYPE CDocDispatch::GetIDsOfNames(
REFIID riid,
LPOLESTR __RPC_FAR *rgszNames,
UINT cNames,
LCID lcid,
DISPID __RPC_FAR *rgDispId)
{
UNREFERENCED_PARAMETER(riid);
UNREFERENCED_PARAMETER(lcid); HRESULT hr = S_OK; for (UINT i=0; i < cNames; i++)
{
CComBSTR bsName = rgszNames[i]; if (0 == _tcsicmp(bsName, _T("Func1")))
{
rgDispId[i] = ID_OF_FUNC1;
}
else if(0 == _tcsicmp(bsName, _T("Func2")))
{
rgDispId[i] = ID_OF_FUNC2;
}
else
{
// One or more are unknown so set the return code accordingly
hr = ResultFromScode(DISP_E_UNKNOWNNAME);
rgDispId[i] = DISPID_UNKNOWN;
hr = E_NOTIMPL;
}
} ... ...
return hr;
}
实现CDocDispatch::Invoke
HRESULT STDMETHODCALLTYPE CDocDispatch::Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pvarResult,
EXCEPINFO __RPC_FAR *pexcepinfo,
UINT __RPC_FAR *puArgErr)
{
HRESULT hr = S_OK; switch(dispIdMember)
{
case ID_OF_FUNC1:
if(m_pSite)
{
// 如果调用其他js函数,需要注意参数顺序
m_pSite->CallToJsFunction(pDispParams->rgvarg[1].bstrVal, pDispParams->rgvarg[0].bstrVal);
}
break;
case ID_OF_FUNC2:
if(m_pSite)
{
// 设置返回值
long result = ...
CComVariant varResult(result );
hr = varResult.Detach(pvarResult);
}
break;
default:
break; } ... ... return hr;
}
JS调用BHO的更多相关文章
- BHO插件操作IE浏览器,js调用C#方法
BHO是IE浏览器的扩展程序,全名Browser Helper Object,文件格式为DLL文件.可对IE浏览器的界面和访问内容进行修改操作.BHO只适用于IE浏览器,对其他任何浏览器都没有作用.( ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- 如何通过JS调用某段SQL语句
如何通过JS调用某段SQL语句,这样的需求在报表.数据平台开发中很常见.以报表平台FineReport开发为例,例如在点击某个按钮之后,来判断一下数据库条数,再决定下一步操作.那这在后台如何实现呢? ...
- iOS开发--JS调用原生OC篇
JS调用原生OC篇 方式一(反正我不用) 第一种方式是用JS发起一个假的URL请求,然后利用UIWebView的代理方法拦截这次请求,然后再做相应的处理. 我写了一个简单的HTML网页和一个btn点击 ...
- 通过js调用android原生方法
有时候我们有这样一个需求,监听html中控件的一些事件.例如点击html中某个按钮,跳转到别的activity,复制某段文本. 首先是对webview的设置: myWebView = (WebView ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...
- android webView开发之js调用java代码示例
1.webView设置 webView.getSettings().setJavaScriptEnabled(true);//设置支持js webView.addJavascriptInterface ...
- c#JS调用
using MSScriptControl; using System; using System.Collections.Generic; using System.Reflection; usin ...
- Android 使用js调用Java
效果如: 主要用到一个接口类:MyObject package com.example.jsdemo; import android.content.Context; import android.s ...
随机推荐
- Markdown中插入数学公式
如果想复杂使用的话,百度Latex公式,找些看一下. 使用MathJax引擎 大家都看过Stackoverflow上的公式吧,漂亮,其生成的不是图片.这就要用到MathJax引擎,在Markdown中 ...
- codeforces 659 G. Fence Divercity 组合数学 dp
http://codeforces.com/problemset/problem/659/G 思路: f(i,0/1,0/1) 表示到了第i个,要被切的块开始了没有,结束了没有的状态的方案数 递推看代 ...
- python 将字典的键&值从byte类型转换为str类型
def convert(data): if isinstance(data, bytes): return data.decode('ascii') if isinstance(data, dict) ...
- (转载)关于web端功能测试的测试方向
一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...
- IOS畅销榜
20W 在80-100 30W 在50左右 50W 在30左右 100W在20左右 N-1日的 收入 对N日还有权重的影响
- String 及其数组的相关问题
由其他类型转String一般用三种方法 方法1:采用 Object.toString()方法 请看下面的例子: Object object = getObject(); System.out.prin ...
- HTTP 权威指南
第一章 http概述 1.3.1 媒体类型 - http为每种web传输的数据格式加上MIME类型数据标签(multipurpose internet mail 1.4 事务 一个请求 + 一个响应 ...
- ComboBox的数据绑定
这里的ComboBox指System.Windows.Forms中的ComboBox. 使用对象数据源 IList<Model> models = ModelService.GetAllM ...
- ---解决git pull 后出现冲突的解决方法
0. git statusOn branch masterYour branch and 'origin/master' have diverged,and have 1 and 3 differen ...
- linq 对Sum()函数的支持
首先看一段SQL语句: SELECT SUM(TASKAPPR) AS APPRCOUNT, SUM(TASKLOCKED) AS LOCKEDCOUNT, SUM(TASKCHECKED) AS C ...