Com 来自execScript(IHTMLWindow2)的返回值

Com 来自execScript(IHTMLWindow2)的返回值,com,winapi,Com,Winapi,从IHTMLWindow2::execScript获取返回值的最佳方法是什么 我找到了这个链接,我还没试过,这是正确的方法吗 问候 Manoj < P>是的,System.Windows.Forms.HtmlDocument.InvokeScript得到返回值。 < P>这里显示了如何用C++来做这件事。< /P> 接下来是我对它的解释。假设您的客户端JavaScript是: function myMethod(name) { alert("Hello " + name);

从IHTMLWindow2::execScript获取返回值的最佳方法是什么

我找到了这个链接,我还没试过,这是正确的方法吗

问候
Manoj

< P>是的,System.Windows.Forms.HtmlDocument.InvokeScript得到返回值。

< P>这里显示了如何用C++来做这件事。< /P> 接下来是我对它的解释。假设您的客户端JavaScript是:

function myMethod(name)
{
    alert("Hello " + name);

    return "Got it!";
}
您可以这样称呼它:

CStringArray arrArgs;
arrArgs.Add(L"John Smith");

CComVariant varRes;
if(CallClientScript(L"myMethod", &arrArgs, &varRes))
{
    if(varRes.vt == VT_BSTR)
        AfxMessageBox(varRes.bstrVal);
}
其中与IHTMLWindow2接口的实际功能如下:

BOOL CallClientScript(LPCTSTR pStrFuncName, CStringArray* pArrFuncArgs, CComVariant* pOutVarRes)
{
    //Call client function in HTML
    //'pStrFuncName' = client script function name
    //'pArrFuncArgs' = if not NULL, list of arguments
    //'pOutVarRes' = if not NULL, will receive the return value
    //RETURN:
    //      = TRUE if done
    BOOL bRes = FALSE;

    CComVariant vaResult;

    CComPtr<IHTMLDocument2> pIDoc2;
    if(SUCCEEDED(this->GetDHtmlDocument(&pIDoc2)))  //Uses CDHtmlDialog as 'this'
    {
        //Getting IDispatch for Java Script objects
        CComPtr<IDispatch> spScript;
        if(SUCCEEDED(pIDoc2->get_Script(&spScript)))
        {
            //Find dispid for given function in the object
            CComBSTR bstrMember(pStrFuncName);
            DISPID dispid = NULL;
            if(SUCCEEDED(spScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_USER_DEFAULT, &dispid)))
            {

                const int arraySize = pArrFuncArgs ? pArrFuncArgs->GetSize() : 0;

                //Putting parameters  
                DISPPARAMS dispparams;
                memset(&dispparams, 0, sizeof dispparams);
                dispparams.cArgs      = arraySize;
                dispparams.rgvarg     = new VARIANT[dispparams.cArgs];
                dispparams.cNamedArgs = 0;

                for( int i = 0; i < arraySize; i++)
                {
                    CComBSTR bstr = pArrFuncArgs->GetAt(arraySize - 1 - i); // back reading
                    bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
                    dispparams.rgvarg[i].vt = VT_BSTR;
                }

                EXCEPINFO excepInfo;
                memset(&excepInfo, 0, sizeof excepInfo);
                UINT nArgErr = (UINT)-1;  // initialize to invalid arg

                //Call JavaScript function         
                if(SUCCEEDED(spScript->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr)))
                {
                    //Done!
                    bRes = TRUE;
                }

                //Free mem
                delete [] dispparams.rgvarg;
            }
        }
    }

    if(pOutVarRes)
        *pOutVarRes = vaResult;

    return bRes;
}
BOOL CallClientScript(LPCTSTR pStrFuncName、CStringArray*pArrFuncArgs、CComVariant*pOutVarRes)
{
//HTML中的调用客户端函数
//“pStrFuncName”=客户端脚本函数名
//“pArrFuncArgs”=如果不为NULL,则为参数列表
//“pOutVarRes”=如果不为NULL,将接收返回值
//返回:
//=如果完成,则为TRUE
布尔-布雷斯=假;
c变异性vaResult;
CComPtr pIDoc2;
if(successed(this->GetDHtmlDocument(&pIDoc2))//使用CDHtmlDialog作为“this”
{
//获取Java脚本对象的IDispatch
CComPtr spScript;
if(成功(pIDoc2->get_脚本(&spScript)))
{
//在对象中查找给定函数的dispid
CComBSTR bstrMember(pStrFuncName);
DISPID DISPID=NULL;
if(成功(spScript->GetIDsOfNames(IID\u NULL,&bstrMember,1,LOCALE\u USER\u DEFAULT,&dispid)))
{
常量int arraySize=pArrFuncArgs?pArrFuncArgs->GetSize():0;
//放置参数
DISPPARAMS DISPPARAMS;
memset(&dispparams,0,dispparams的大小);
dispparams.cArgs=阵列化;
dispparams.rgvarg=新变量[dispparams.cArgs];
dispparams.cNamedArgs=0;
for(int i=0;iGetAt(arraySize-1-i);//回读
bstr.CopyTo(&disparams.rgvarg[i].bstrVal);
dispparams.rgvarg[i].vt=vt\u BSTR;
}
EXCEPINFO EXCEPINFO;
memset(&excepInfo,0,excepInfo的大小);
UINT narger=(UINT)-1;//初始化为无效参数
//调用JavaScript函数
if(成功(spScript->Invoke(dispid,IID_NULL,0,DISPATCH_方法,&dispparams,&vaResult,&excepInfo,&nArgErr)))
{
//完成了!
bRes=真;
}
//自由内存
删除[]dispparams.rgvarg;
}
}
}
如果(家禽)
*波特瓦雷斯=瓦雷索;
返回布雷斯;
}