ActiveX與JavaScript交互,回調等~

       因爲最近工做須要,查詢了一些ActiveX與JavaScript交互方面的資料,現總結以下,但願對有這方面須要的朋友們有用!呵呵!因爲ATL和 COM等相關知識相對比較複雜,本人對此瞭解比較少,因此在開發時我選擇了基於MFC的ActiveX。本文主要講述了,在ActiveX中多線程操做 時,如何回調JavaScript的方法!其基本原理是,在線程中遇到須要調用JavaScript的方法時,先向ActiveX控件發送消息,而後在 ActiveX控件的消息函數中調用JavaScript的方法,從而實現回調。javascript

      程序所實現的功能爲,1、頁面中經過Javascrpit,調到ActiveX的方法,傳入相關參數,由ActiveX完成其它工做。2、頁面中經過 Javascrpit,調到ActiveX的方法,獲取ActiveX中的處理數據,完成頁面數據的顯示等操做。3、在ActiveX中建立線程,在線程 中實現回調Javascrpit的方法。java

      程序實現以下(VC2005),首先打開VC2005,建立ActiveX控件,多線程

點擊「肯定」,而後點擊「下一步」,在「控件設置」中,設置以下ide

而後點擊完成。函數

打開CECActiveCtrl類,選擇重載OnSetClientSite方法,在此方法輸入:學習

try 
{    
if (m_pClientSite)
{
RecreateControlWindow();
}
else
{
DestroyWindow();
}

catch(...) {
}   測試

打開文件ECActive.idl,在「調度接口」中添加自定義接口:this

    [id(1), helpstring("輸入內容")] short SetStr([in] BSTR bstrValue);
[id(2), helpstring("獲取進度")] short GetProgrss();
[id(3), helpstring("獲取內容")] BSTR GetStr();
[id(4), helpstring("啓動線程")] void StarThread();spa

打開文件ECActiveCtrl.h,添加自定義方法:線程

afx_msg short   OnSetString(BSTR bstrValue);
afx_msg short   OnGetProgrss();
afx_msg BSTR    OnGetString();
afx_msg void    OnStarThread();
afx_msg LRESULT OnUploadFileProg(WPARAM wParam, LPARAM lParam);

打開文件ECActiveCtrl.cpp,添加

調度映射:

DISP_FUNCTION(CECActiveCtrl, "SetStr", OnSetString, VT_I2, VTS_BSTR) 
DISP_FUNCTION(CECActiveCtrl, "GetProgrss", OnGetProgrss, VT_I2, VTS_NONE) 
DISP_FUNCTION(CECActiveCtrl, "GetStr", OnGetString, VT_BSTR, VTS_NONE) 
DISP_FUNCTION(CECActiveCtrl, "StarThread", OnStarThread, VT_EMPTY, VTS_NONE)

實現方法:

//輸入參數

short CECActiveCtrl::OnSetString(BSTR bstrValue)

if (NULL != bstrValue)
{
MessageBox(bstrValue, L"提示", 0);
return (short)wcslen(bstrValue);
}
return 0;// (short)wcslen(bstrValue);
}

//回調按鈕方法
short CECActiveCtrl::OnGetProgrss()
{
try
{
LPOLECLIENTSITE pClientSite = GetClientSite();    
if(pClientSite == NULL) return 0;    
IServiceProvider *isp = NULL;    
HRESULT hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp));    
if (FAILED(hr)) return 1;    
IServiceProvider *isp2 = NULL;    
hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));    
isp->Release();    
if (FAILED(hr)) return 2;    
IWebBrowser2* browser = NULL;    
hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&browser));    
isp2->Release();    
if (FAILED(hr)) return 3;    
IHTMLDocument* doc = NULL;    
hr=browser->get_Document((IDispatch**)&doc);    
browser->Release();    
if(FAILED(hr)) return 4;    
IDispatch* script = NULL;    
hr=doc->get_Script(&script);    
doc->Release();    
if(FAILED(hr)) return 5;
DISPID dispid;    
OLECHAR FAR* sHello = L"FileProgress";    
hr=script->GetIDsOfNames(IID_NULL,&sHello,1,LOCALE_SYSTEM_DEFAULT,&dispid);    
if(FAILED(hr)) return 6;
VARIANTARG varPara[2];
varPara[0].vt   = VT_BOOL; //參數2
varPara[0].lVal = TRUE;
varPara[1].vt   = VT_I4;   //參數1
varPara[1].lVal = 50;
DISPPARAMS dpNoArgs = {varPara, NULL, 2, 0};
//DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};//無參數
CComVariant varDisp;
hr = script->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&dpNoArgs,&varDisp,NULL,NULL);
script->Release(); 
if (FAILED(hr)) return 7;

catch(...) {
}
return 50;
}

//獲取返回值

BSTR CECActiveCtrl::OnGetString()
{
BSTR bstrVal = L"Wangfeng!";
return bstrVal;
}

//啓動線程

void CECActiveCtrl::OnStarThread()
{
DWORD dwID;
m_hThread = CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE)FileUploadThread, (LPVOID)this, NULL, &dwID);
TRACE("Started the thread %x\n",dwID);

}

//消息函數

LRESULT CECActiveCtrl::OnUploadFileProg(WPARAM wParam, LPARAM lParam)
{
try 
{
LPOLECLIENTSITE pClientSite = GetClientSite();    
if(pClientSite == NULL) return 0;    
IServiceProvider *isp = NULL;    
HRESULT hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp));    
if (FAILED(hr)) return 1;    
IServiceProvider *isp2 = NULL;    
hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));    
isp->Release();    
if (FAILED(hr)) return 2;    
IWebBrowser2* browser = NULL;    
hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&browser));    
isp2->Release();    
if (FAILED(hr)) return 3;    
IHTMLDocument* doc = NULL;    
hr=browser->get_Document((IDispatch**)&doc);    
browser->Release();    
if(FAILED(hr)) return 4;    
IDispatch* script = NULL;    
hr=doc->get_Script(&script);    
doc->Release();    
if(FAILED(hr)) return 5;
DISPID dispid;    
OLECHAR FAR* sHello = L"FileProgress";    
hr=script->GetIDsOfNames(IID_NULL,&sHello,1,LOCALE_SYSTEM_DEFAULT,&dispid);    
if(FAILED(hr)) return 6;
VARIANTARG varPara[2];
varPara[0].vt   = VT_BOOL; //參數2
varPara[0].lVal = TRUE;
varPara[1].vt   = VT_I4;   //參數1
varPara[1].lVal = (int)wParam;
DISPPARAMS dpNoArgs = {varPara, NULL, 2, 0};
//DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};//無參數
CComVariant varDisp;
hr = script->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&dpNoArgs,&varDisp,NULL,NULL);
script->Release(); 
if (FAILED(hr)) return 7;

catch(...) {
}

return S_OK;
}

 

網頁部分:

<HTML>
<H1> 測試 ActiveX 頁面 </H1><p>

<OBJECT ID="ECActive" CLASSID="CLSID:94FD3218-4B05-4385-812B-55C0F46ED606"> </OBJECT>

<script language="javascript">

function SetStr()
{
if(window.ActiveXObject)
{    
try
{    
var strValue;
strValue=document.form1.text1.value;
<!--alert(strValue);-->
document.getElementById("ECActive").SetStr(strValue);
}
catch(e)
{
alert(e);
}    
}   

}

function GetStr()
{
if(window.ActiveXObject)
{    
try
{
var strValue = document.getElementById("ECActive").GetStr();
alert(strValue);
}
catch(e)
{
alert(e);
}    
}   

}

function GetProgress()
{
if(window.ActiveXObject)
{    
try

var varValue;
varValue = document.getElementById("ECActive").GetProgrss();
<!--alert(strValue);-->
}
catch(e)
{
alert(e);
}    
}    
}

function StarThread()
{
if(window.ActiveXObject)
{    
try

document.getElementById("ECActive").StarThread();
}
catch(e)
{
alert(e);
}    
}    
}

</script>


<script language="javascript" type="text/javascript"> 
var element="|"; //滾動條單元豎線 
var elements="|"; //滾動條當前豎線


function FileProgress(nProgress, bSendOK)

elements =elements + element; //滾動條當前豎線增長一個滾動條單元豎線 
document.loading.bar.value=elements; //設置窗體loading表單中bar元素的當前值 
document.loading.percentage.value=nProgress+"%"; //設置窗體loading表單中percentage元素的當前值 

</script>

<body>

<center>
<form name="form1">
<input type="text" name="text1" size="50"><p>
<input type="button" value="輸入參數" onclick="javascript:SetStr()"/>
<input type="button" value="返回結果" onclick="javascript:GetStr()"/>
<input type="button" value="回調我吧" onclick="javascript:GetProgress()"/>
<input type="button" value="啓動線程" onclick="javascript:StarThread()"/>
</form>

<form name="loading"> 
<p align="center"> 
<input type="text" name="bar" size="100" style="border-style:none; background-color:#D3E8D0; font-weight:bold" /> 
<input type="text" name="percentage" style="border-style:none; background-color:#FFFFFF; max-width:30px"/> 
</p>

</form>


</body>

</HTML>

      總結,以上即爲代碼的主要部分,若有不妥之處、不理解之處,請與本人聯繫!歡迎與各位共同討論學習!

相關文章
相關標籤/搜索