you only have to pass IDispatch* to the script function. void CScriptDemoDlg::OnTestOwnctrl() {//http://61.133.87.165/bbs/attachment.php?s=&postid=382458 //http://www.codeproject.com/com/ScriptDemo.asp
// TODO: Add your control notification handler code here LPUNKNOWN lpknow=m_mytestctrl.GetControlUnknown(); if(!lpknow) return; LPDISPATCH lpDisp=NULL; HRESULT hr=lpknow->QueryInterface(IID_IDispatch,(void**)(&lpDisp)); if(FAILED(hr)||NULL==lpDisp) return; CString strProc; CString strCode = "function TestMyCtrl(obj) \n {\n obj.test(\"called by my test script in 319\");\n }\n"; m_ctlFunctions.GetWindowText( strProc ); strProc = "TestMyCtrl"; if (!m_ScriptObj.AddScript( strCode )) { CString strError = m_ScriptObj.GetErrorString(); m_ctlResult.SetWindowText( strError ); } else m_ctlResult.SetWindowText( _T("") );
/* function TestMyCtrl(obj) { obj.test("a"); } Function TestMyCtrl(obj) obj.test("aafdsadfdsgdasgsdf") End Function */
CSafeArrayHelper sfHelper; try{ _variant_t var; sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter var = lpDisp; sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0 LPSAFEARRAY sa = sfHelper.GetArray(); _variant_t varRet; if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet)) m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) ); else { CString strError = m_ScriptObj.GetErrorString(); m_ctlResult.SetWindowText( strError ); } } catch(...) { CString strError = m_ScriptObj.GetErrorString(); m_ctlResult.SetWindowText( strError ); } } I define an ATL control, with a method HRESULT Test([in]BSTR bstrparam); insert this control into a dialog; add a memeber to the dialog class CMyScriptCtrl m_mytestctrl; use helper code found in http://www.codeproject.com/com/ScriptDemo.asp to execute its method by script, and it works!
void CScriptDemoDlg::OnTestOwnctrl()
{//http://61.133.87.165/bbs/attachment.php?s=&postid=382458
//http://www.codeproject.com/com/ScriptDemo.asp
// TODO: Add your control notification handler code here
LPUNKNOWN lpknow=m_mytestctrl.GetControlUnknown();
if(!lpknow)
return;
LPDISPATCH lpDisp=NULL;
HRESULT hr=lpknow->QueryInterface(IID_IDispatch,(void**)(&lpDisp));
if(FAILED(hr)||NULL==lpDisp)
return;
CString strProc;
CString strCode = "function TestMyCtrl(obj) \n {\n obj.test(\"called by my test script in 319\");\n }\n";
m_ctlFunctions.GetWindowText( strProc );
strProc = "TestMyCtrl";
if (!m_ScriptObj.AddScript( strCode ))
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
else
m_ctlResult.SetWindowText( _T("") );
/*
function TestMyCtrl(obj)
{
obj.test("a");
} Function TestMyCtrl(obj)
obj.test("aafdsadfdsgdasgsdf")
End Function
*/
CSafeArrayHelper sfHelper;
try{
_variant_t var;
sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter
var = lpDisp;
sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0
LPSAFEARRAY sa = sfHelper.GetArray();
_variant_t varRet;
if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet))
m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) );
else
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}
catch(...)
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}
I define an ATL control, with a method HRESULT Test([in]BSTR bstrparam);
insert this control into a dialog;
add a memeber to the dialog class
CMyScriptCtrl m_mytestctrl;
use helper code found in http://www.codeproject.com/com/ScriptDemo.asp to execute its method by script, and it works!
ms-help://MS.VSCC/MS.MSDNVS/vcsample/html/vcsmpTSTCONActiveXControlTestContainer.htm