心寄笔端 附庸风雅

甘草的技术博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

有一段时间不写技术文章,貌似博客园的缩进样式变化了。

这个主题讲IE插件开发,又以BHO为主要内容,也谈一些其他相关的,也有一些关于ATL,和我的心得方面的。希望读者能给我一些意见,我做IE插件,确实没有什么经验。

BHO

BHO就是IE浏览器的辅助对象,我们需要编写的是一个IE进程内COM组件,要实现几个特定的接口。其实,了解COM的朋友,就不会觉得难了。

首先,一个BHO必须实现IObjectWithSite接口。

我们实现此接口,然后将BHO的CLSID添加到注册表中,由此创建一个简单的浏览器扩展。

【in VS2008 】

1. 创建一个ATL简单对象,

2. 在Options - Support里面选择支持IObjectWithSite。

3. 在.Rgs里面添加如下(类似)方法

HKLM {
  NoRemove SOFTWARE {
    NoRemove Microsoft {   
      NoRemove Windows {
        NoRemove CurrentVersion {
          NoRemove Explorer {
            NoRemove 
'Browser Helper Objects' {
              ForceRemove 
'{GUID}' = s 'BHO Name' {
                val 
'NoExplorer' = d '1'
              } } } } } } } 

NoExplorer = 1,什么意思,我还没有确定。

还没有完,还得写代码~

4. 实现HRESULT SetSite(IUnknown* pUnkSite) 接口方法。

通过pUnSite可以Query到IWebBrowser2*接口。


执行JavaScript代码

可以用如下代码执行JavaScript代码:

    IDispatch* pDoc = NULL;
    HRESULT h 
= m_pWebBrowser->get_Document(&pDoc);
    
if (SUCCEEDED(h))
    {
        IHTMLWindow2
* pHTMLWnd = NULL;
        ((IHTMLDocument2
*)pDoc)->get_parentWindow(&pHTMLWnd);
        
if (pHTMLWnd != NULL)
        {
            VARIANT varRet;
            
// I got it;
            CComBSTR jsCode = L"function a() {     a = 1;alert(a * 2 + a); }a();";
            HRESULT e 
= pHTMLWnd->execScript(jsCode, L"Javascript"&varRet);
            
if (SUCCEEDED(e))
            {

            }
    ... ...

需要说明的是,varRet这个变量,是没法真正获取JavaScript返回值的。

 

 

 

 

 

 

 

 

posted on 2010-03-26 11:28  甘草  阅读(1131)  评论(0编辑  收藏  举报
Baidu
Google
心寄笔端
TEST
以后我会加上Power By的,先别介意