ActiveX如何調用引用該ActiveX的網頁中的JavaScript函數

來源:互聯網
上載者:User
active|activex|javascript|函數|網頁  

前言

很多網友問到,在HTML的頁面中放置一個COM對象,這個對象該如何調用頁面中的指令碼函數的問題,本人近日也因為工作需要實現這樣的功能,在網上搜尋後,獲得了很多協助,但並沒有發現完整的實現。本文描述了實現過程中的幾個要點,同時提供一個樣本工程的下載。

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又該如何獲得。

本工程是用.NET2003弄的,可能你們系統不支援,不過沒有關係,重要建立自己的COM工程後,把IrDav的相關檔案包含添加到工程就可以了。

對不起,由於本人沒有非常穩定空間,不能提供下載,如果有需要,請給本人QQ(68558710)或MSN(Triout@msn.com)或EMail(Triout@163.com)聯絡。如果您有空間,請告知,以便上傳後提供串連。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.