none
IDispatch::Invoke()无法获取被调用JS函数返回值 RRS feed

  • 问题

  • Hi 各位,

    我最近在使用web browser时遇到一个问题。

    当我用IDispatch接口调用网页中JS函数时,无法获取函数的返回值。准确的说,返回值是一个空的字符串。我期望的返回值是一个非空的字符串。

    在网页中调试该JS函数时,函数会返回正确的字符串。

    而且,在我自己写的简单的测试页面里面,则可以正确获取返回值。

    有人有遇到过这样的情况么?

    2012年6月27日 8:27

全部回复

  • 可否贴出IDispatch调用所使用的代码?
    2012年7月2日 23:06
  • 没有代码,不知道问题出在哪里。所以,我自己尝试了一下,你看看,有没有帮助。

    Javascript中的函数定义如下:

    function ReturnString() {

    return "This is the result";

    }

    IDispatch的调用如下:

       DISPID dispId;
       OLECHAR* szFuncName = L"ReturnString";
       hr = spScriptDisp->GetIDsOfNames(IID_NULL, &szFuncName, /*cNames*/1, LOCALE_SYSTEM_DEFAULT, &dispId);
       if (SUCCEEDED(hr))
       {
        DISPPARAMS dispParams;
        dispParams.cArgs = 0;
        dispParams.cNamedArgs = 0;
        dispParams.rgdispidNamedArgs = nullptr;
        dispParams.rgvarg = nullptr;

        VARIANT varResult;
        VariantClear(&varResult);
        hr = spScriptDisp->Invoke(
         dispId,
         IID_NULL,
         LOCALE_SYSTEM_DEFAULT,
         DISPATCH_METHOD,
         &dispParams,
         &varResult,
         /*pExcepInfo*/nullptr,
         /*puArgErr*/nullptr);

        if (SUCCEEDED(hr))
        {
         WCHAR szMessage[1024];
         StringCchPrintfW(szMessage, /*cchDest*/1024, L"Returned String is \'%s\'.", (WCHAR*)varResult.bstrVal);
         ::MessageBoxW(/*hWnd*/NULL, szMessage, /*lpCaption*/L"Result", MB_OK);
        }
        else
        {
         ::MessageBoxW(/*hWnd*/NULL, /*lpText*/L"Failed to call ReturnString().", /*lpCaption*/L"Result", MB_OK);
        }
        VariantClear(&varResult);

       }

    运行结果如下:

    ---------------------------
    Result
    ---------------------------
    Returned String is 'This is the result'.
    ---------------------------
    OK  
    ---------------------------

    运行环境是:Windows 8 Release Preview + VS2012 RC。

    如果还是不能解决你的问题,请贴出你的代码,大家一起讨论。


    2012年7月5日 4:39