请问,atl组件如何调用页面里的javascript脚本函数,或者有几种方式呢?
比如页面里如下:
<object classid="clsid:641CA175-E775-499C-8C4D-65FCB70770CA" id="cb"></object>
<script language="javascript" type="text/javascript">
function test()
{
try{
alert('helloworld');
}catch(e){
alert(e.message);
}
}
function ttt()
{
cd.xxx();//xxx是atl里面一个函数
}
</script>
<input type="button" value="测试" onclick="ttt()">现在我想要的是:
我点击按钮,那么调用了atl组件,在atl组件的xxx()方法调用过程 或者 结束后我想调用 这个页面的test(),我该怎么写呢?用事件还是什么其他方式,最好把全部方法都告诉我吧。如果可能,最好说下如果将得到的结果返回给test(),如何传递参数?
先谢谢大家了。
比如页面里如下:
<object classid="clsid:641CA175-E775-499C-8C4D-65FCB70770CA" id="cb"></object>
<script language="javascript" type="text/javascript">
function test()
{
try{
alert('helloworld');
}catch(e){
alert(e.message);
}
}
function ttt()
{
cd.xxx();//xxx是atl里面一个函数
}
</script>
<input type="button" value="测试" onclick="ttt()">现在我想要的是:
我点击按钮,那么调用了atl组件,在atl组件的xxx()方法调用过程 或者 结束后我想调用 这个页面的test(),我该怎么写呢?用事件还是什么其他方式,最好把全部方法都告诉我吧。如果可能,最好说下如果将得到的结果返回给test(),如何传递参数?
先谢谢大家了。
const wchar_t SCRIPTSITE[] = L"SCRIPTSITE";#define SCRIPTITEM_NAMEDITEM (SCRIPTITEM_ISSOURCE | \
SCRIPTITEM_ISVISIBLE | \
SCRIPTITEM_GLOBALMEMBERS)class CActiveScriptSite : public IActiveScriptSite
, public IActiveScriptSiteWindow
{
LONG m_cRef;
LPUNKNOWN m_pdispshell;
public:
CActiveScriptSite(LPUNKNOWN pshell)
: m_cRef(0)
, m_pdispshell(pshell)
{
ASSERT(m_pdispshell);
// if (m_pdispshell)
// m_pdispshell->AddRef();
} ~CActiveScriptSite(void)
{
// if (m_pdispshell)
// m_pdispshell->Release();
} // IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
{
if (riid == IID_IUnknown||riid == IID_IActiveScriptSite)
*ppv = (IActiveScriptSite*)this;
else if (riid == IID_IActiveScriptSiteWindow)
*ppv = (IActiveScriptSiteWindow*)this;
else
return (*ppv = 0), E_OUTOFMEMORY;
((IUnknown*)*ppv)->AddRef();
return S_OK;
} STDMETHODIMP_(ULONG) AddRef()
{
return InterlockedIncrement(&m_cRef);
} STDMETHODIMP_(ULONG) Release()
{
if (InterlockedDecrement(&m_cRef))
return m_cRef;
delete this;
return 0;
} // IActiveScriptSite methods
STDMETHODIMP GetLCID(LCID *plcid)
{
return E_NOTIMPL;
} STDMETHODIMP GetItemInfo(LPCOLESTR pstrName, DWORD dwReturnMask,
IUnknown **ppiunkItem, ITypeInfo **ppti)
{
if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
if (!ppti)
return E_INVALIDARG;
*ppti = NULL;
} if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
if (!ppiunkItem)
return E_INVALIDARG;
*ppiunkItem = NULL;
} // Required LPUNKNOWN T::GetObjectPointer(const WCHAR* pstrName)
if (wcscmp(pstrName, SCRIPTSITE))
{
return TYPE_E_ELEMENTNOTFOUND;
} if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
// Use IProvideClassInfo to get ITypeInfo of coclass!
IProvideClassInfo *pci = NULL;
HRESULT hr = m_pdispshell->QueryInterface(IID_IProvideClassInfo, (void**)&pci);
if (SUCCEEDED(hr) && pci)
{
hr = pci->GetClassInfo(ppti);
} // Release interface
if (pci)
pci->Release(); if (FAILED(hr))
return E_FAIL;
} if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
*ppiunkItem = m_pdispshell;
(*ppiunkItem)->AddRef(); // because returning
} return S_OK;
} STDMETHODIMP OnScriptError(IActiveScriptError *pscripterror)
{
DWORD dwCookie;
LONG nChar;
ULONG nLine;
BSTR bstr = 0;
EXCEPINFO ei; ZeroMemory(&ei, sizeof(ei));
pscripterror->GetSourcePosition(&dwCookie, &nLine, &nChar);
pscripterror->GetSourceLineText(&bstr);
pscripterror->GetExceptionInfo(&ei); OLECHAR wszOutput[1024];
//swprintf(wszOutput, OLESTR("%s\n[Line: %d] %s\n%s"),
wsprintfW(wszOutput, OLESTR("%s\n[Line: %d] %s\n%s"),
ei.bstrSource, nLine, ei.bstrDescription,
bstr ? bstr : OLESTR("")); SysFreeString(bstr);
SysFreeString(ei.bstrSource);
SysFreeString(ei.bstrDescription);
SysFreeString(ei.bstrHelpFile);
MessageBoxW(GetDesktopWindow(),
wszOutput,
L"Error",
MB_SETFOREGROUND); return S_OK;
} STDMETHODIMP GetDocVersionString(BSTR *pbstrVersion)
{
*pbstrVersion = SysAllocString(ASSVERSION);
return S_OK;
} STDMETHODIMP OnScriptTerminate(const VARIANT *pvr, const EXCEPINFO *pei)
{
return S_OK;
} STDMETHODIMP OnStateChange(SCRIPTSTATE ssScriptState)
{
return S_OK;
} STDMETHODIMP OnEnterScript(void)
{
return S_OK;
} STDMETHODIMP OnLeaveScript(void)
{
return S_OK;
} // IActiveScriptSiteWindow methods
STDMETHODIMP GetWindow(HWND *phwnd)
{
*phwnd = GetDesktopWindow(); return S_OK;
} STDMETHODIMP EnableModeless(BOOL)
{
return S_OK;
}
};
class CScriptEngine
{
public:
CScriptEngine(LPDISPATCH pUnk) : m_pUnk(pUnk)
, m_pSite(0)
, m_pASParse(0)
, m_pAScript(0)
{
ASSERT(m_pUnk); m_pSite = new CActiveScriptSite(m_pUnk);
m_pSite->AddRef();
} ~CScriptEngine()
{
ReleaseObjects();
m_pSite->Release();
} void ReleaseObjects()
{
SAFE_RELEASE(m_pASParse); if (0 != m_pAScript)
{
m_pAScript->Close();
m_pAScript->Release();
m_pAScript = 0;
}
} BOOL CreateEngine(LPCOLESTR pstrProgID)
{
// Auto deletion of script engine
ReleaseObjects(); CLSID clsid;
// Search for LanguageID and create instance of script engine
if (SUCCEEDED(CLSIDFromProgID(pstrProgID, &clsid)))
{
// If this happens, the scripting engine is probably not properly registered
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IActiveScript, (void **)&m_pAScript);
// Script Engine must support IActiveScriptParse for us to use it
if (SUCCEEDED(hr))
hr = m_pAScript->QueryInterface(IID_IActiveScriptParse, (void **)&m_pASParse); if (SUCCEEDED(hr))
hr = m_pAScript->SetScriptSite( (IActiveScriptSite*) m_pSite); // InitNew the object:
if (SUCCEEDED(hr))
hr = m_pASParse->InitNew(); // Add Top-level Global Named Item
if (SUCCEEDED(hr))
hr = m_pAScript->AddNamedItem(SCRIPTSITE, SCRIPTITEM_NAMEDITEM); if (SUCCEEDED(hr))
hr = m_pAScript->SetScriptState(SCRIPTSTATE_STARTED); if (SUCCEEDED(hr))
return TRUE; ReleaseObjects();
}
return FALSE;
} STDMETHODIMP RunScript (BSTR bstrScript)
{
EXCEPINFO ei = { 0 };
HRESULT hr = m_pASParse->ParseScriptText(bstrScript, 0, 0, 0, 0, 0,
SCRIPTTEXT_ISPERSISTENT|SCRIPTTEXT_ISVISIBLE,
0, &ei);
return hr;
} STDMETHODIMP LoadScript (BSTR bstrFile)
{
HRESULT hr;
IDispatch *pDisp = 0; EXCEPINFO ei = {0};
OLECHAR *pwszCode = ReadFileAsOLETEXT((LPCWSTR)bstrFile);
if (pwszCode)
{
hr = m_pASParse->ParseScriptText(pwszCode, 0, 0, 0, 0, 0,
SCRIPTTEXT_ISPERSISTENT
|SCRIPTTEXT_ISVISIBLE,
0, &ei);
CoTaskMemFree(pwszCode);
} hr = m_pAScript->GetScriptDispatch(0, &pDisp);
LPOLESTR szMain = OLESTR("main");
DISPID dispid;
hr = pDisp->GetIDsOfNames(IID_NULL, &szMain, 1, 9, &dispid);
DISPPARAMS params = { 0, 0, 0, 0 };
hr = pDisp->Invoke(dispid, IID_NULL, 9, DISPATCH_METHOD,
¶ms, 0, 0, 0);
return hr;
}
protected:
LPDISPATCH m_pUnk;
CActiveScriptSite *m_pSite; IActiveScriptParse *m_pASParse;
IActiveScript *m_pAScript;private:
OLECHAR *ReadFileAsOLETEXT(LPCWSTR szFileName)
{
OLECHAR *pwszResult = 0;
HANDLE hfile = CreateFileW(szFileName, GENERIC_READ,
FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (hfile != INVALID_HANDLE_VALUE)
{
DWORD cch = GetFileSize(hfile, 0);
char *psz = (char*)CoTaskMemAlloc(cch + 1);
if (psz)
{
DWORD cb;
ReadFile(hfile, psz, cch, &cb, 0);
pwszResult = (OLECHAR*)CoTaskMemAlloc((cch + 1)*sizeof(OLECHAR));
if (pwszResult)
mbstowcs(pwszResult, psz, cch + 1);
pwszResult[cch] = 0;
CoTaskMemFree(psz);
}
CloseHandle(hfile);
}
return pwszResult;
}};
CScriptEngine * pScriptSite = new CScriptEngine(this);
pScriptSite->CreateEngine(L"JScript");
http://www.nokiamobile.org.cn/28_091231_426179.html