您的位置:首页 > Web前端 > JavaScript

VC调用IE控件里的JS ---by devinghou

2011-02-12 17:05 197 查看
在VC中调用内置浏览器(我是用CDhtmlDialog)中的javascript有很多种方法,但是有的不能返回结果,有的不能调用javascript系统函数。下面的我用过的方法,小结一下:

第一种:通过execScript调用。这种方法,虽然操作方便,但不能获取返回值。

m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);

VARIANT ret;

ret.vt = VT_EMPTY;

BSTR bstr = sScript.AllocSysString();

bRet = m_pHtmlWindow->execScript(bstr, L"javascript", &ret);

::SysFreeString(bstr);

sRet = CString(ret);

第二种:先用GetIDsOfNames找到这个脚本函数名称,然后再调用。这种方法可以返回结果,有返回值。但是无法调用js的系统函数,如eval。

BOOL CDhtmlDlgWindow::CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult)

{

CComPtr spScript;

if (NULL==m_spHtmlDoc)

{

return FALSE;

}

HRESULT hr;

hr = m_spHtmlDoc->get_Script(&spScript);

if(!SUCCEEDED(hr))

{

return FALSE;

}

CComBSTR bstrMember(strFunc);

DISPID dispid = NULL;

hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,

LOCALE_SYSTEM_DEFAULT,&dispid);

if(FAILED(hr))

{

return FALSE;

}

const int arraySize = paramArray.GetSize();

DISPPARAMS dispparams;

memset(&dispparams, 0, sizeof dispparams);

dispparams.cArgs = arraySize;

dispparams.rgvarg = new VARIANT[dispparams.cArgs];

for( int i = 0; i < arraySize; i )

{

CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // 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 = spScript->Invoke(dispid,IID_NULL,0,

DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);

delete [] dispparams.rgvarg;

if(FAILED(hr))

{

return FALSE;

}

*pVarResult = vaResult;

return TRUE;

}

实际使用时,可能是先访问(Navigate)了一个页面。然后,在VC里面对这个页面进行一些js调用,并取回结果。有可能这个js调用的函数是这个页面里面没有的。一般可以用eval_r(一些js语句)这样的形式来调用页面里面没有的函数,但是,现在上面两种方法都不支持eval。

第三种:通过IScriptControl获取当前文档上下文,然后调用IScriptControl::raw_Eval运算。(只能用raw_Eval,用Eval方法会提示没有权限。)

首先定义一个:IScriptControlPtr,然后在OnDocumentComplete里面调用一下 m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);

IScriptControlPtr->AddObject("window", m_pHtmlWindow, VARIANT_TRUE);

第三种需要import "msscript.ocx"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: