接口部分怎么写?
[id(10), helpstring("method startPlayCallback")] HRESULT startPlayCallback([in] VARIANT* CallBackFunc );
Java部分为一般的function生成的函数
function nsPlayCallBack(){
//DllObject.startPlayCallback( nsCallback);
DllObject.startPlayCallback( {callback: function(){document.write("finish");alert("Callback");}});}C++部分调用后强制转换为PlayFinishCallBack类型执行
typedef void (__stdcall *PlayFinishCallBack)();
按照目前的状况,每次一调用JavaScript就IE奔溃了!请教高手,如何写?

解决方案 »

  1.   

    看看我得文章吧:
    http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html
      

  2.   

    当然不能转换成函数指针来调用,脚本传过来的对象是IDispatch接口,你应该用IDispatch::Invoke来调用。如果传过来的是个function,那么DISPID为0,如果是个对象,那么要先用GetIDsOfNames得到DISPID,再Invoke。
      

  3.   

    http://www.codeproject.com/info/search.asp?cats=2&searchkw=invoke+javascript&Submit1=Search&author=&sd=15+Nov+1999&ed=16+Oct+2006
      

  4.   

    SetClientSite(IOleClientSite *pClientSite)
    {
    HRESULT hr = IOleObjectImpl<CInfowareLabNM>::SetClientSite(pClientSite);
    if (pClientSite)
    {
    //m_spClientSite = pClientSite;
    OnSetClientSite() ;
    }
    return S_OK;
    }
    OnSetClientSite()
    {
    HRESULT hr ;
    m_pScript=NULL; CComPtr < IOleContainer > spContainer;
    hr = m_spClientSite->GetContainer(&spContainer); ATLASSERT(spContainer);
    m_pHTMLDocument = spContainer;
    hr=m_pHTMLDocument->get_Script(&m_pScript);
        ATLASSERT(m_pScript);
    return ;}
    outputParam( const DWORD code , const char* param) 
    {
    HRESULT hr;
    if(m_pScript==NULL)
    {
    return -1;
    } CComDispatchDriver spScriptObj( m_pScript ); CComBSTR bstrParam( param );
    VARIANT vt1 , vt2 ;
    vt1.vt = VT_BSTR ;
    vt1.bstrVal = bstrParam.Copy() ;
    vt2.vt = VT_I4 ;
    vt2.lVal = code ; hr = spScriptObj.Invoke2(L"ActiveXReturnMessage", &vt2 , &vt1 );
    return hr; }
      

  5.   

    楼上的正解,我的跟上面差不多IWebBrowser2 *browser;STDMETHODIMP CServerCtrl::SetClientSite() 
    {
    IOleClientSite* pClientSite = GetClientSite(); HRESULT hr = S_OK;
    IServiceProvider *isp, *isp2 = NULL;//用于导航DHTML对象层次,作用就是提供服务 if (!pClientSite)
    {
    COMRELEASE(browser);
    return !S_OK;
    }
    else
    {
    hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>(&isp));
    if (FAILED(hr)) 
    {
    hr = S_OK;
    goto cleanup;
    } hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
    if (FAILED(hr))
    {
    hr = S_OK;
    goto cleanup;
    } //获得浏览器
    hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&browser));
    if (FAILED(hr)) 
    {
    hr = S_OK;
    goto cleanup;
    } cleanup:
    // Free resources.
    COMRELEASE(isp);
    COMRELEASE(isp2);
    return hr;
    } return hr;
    }void CServerCtrl::InvokeScript(char *funcname)
    {
    if (!browser)
    {
    COMRELEASE(browser);
    return;
    } CComPtr<IHTMLDocument2> m_spDoc;
    HRESULT hr = browser->get_Document((IDispatch**)&m_spDoc); 
    if(FAILED(hr))
    throw(""); CComPtr<IDispatch> pScript;
    hr = m_spDoc->get_Script(&pScript);
    if(FAILED(hr))
    throw(""); CComBSTR bstrMember(funcname); 
    DISPID dispid;
    hr=pScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); // 设置函数参数
    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);
    }void CServerCtrl::OnInvokescript()
    {
    // TODO: 在此添加命令处理程序代码
    InvokeScript("OnTest");//OnTest是脚本里的一个函数
    }