请问,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(),如何传递参数?
  先谢谢大家了。

解决方案 »

  1.   

    #pragma once#include <ActivScp.h>#include "ComDefine.h"const wchar_t ASSVERSION[] = L"0.0.0.1";
    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,
    &params, 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");
      

  2.   

    考虑用连接点或者
    http://www.nokiamobile.org.cn/28_091231_426179.html
      

  3.   

    http://topic.csdn.net/u/20100311/16/659d25c4-36d3-463f-befd-3df67a6483e3.html
      

  4.   

    http://download.csdn.net/source/2127345