接口部分怎么写?
[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奔溃了!请教高手,如何写?
[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奔溃了!请教高手,如何写?
http://www.cppblog.com/wlwlxj/archive/2006/07/22/10343.html
{
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; }
{
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是脚本里的一个函数
}