我按照
http://support.microsoft.com/support/kb/articles/q196/0/26.asp
一步一步做下来
VB测试的Demo没有问题,但是Javascript调用出现问题。连接点数目总是0.望各位提点一下!

解决方案 »

  1.   

    // MyAtl.h : Declaration of the CMyAtl
    //ATL simple object fire event jscript/vbscript compatible
    //make http://support.microsoft.com/kb/q196026/ to be script compatible
    //by masterz with vc6(sp6) on windows 2000(sp4) IE6.0
    #ifndef __MYATL_H_
    #define __MYATL_H_
    #include <atlwin.h>
    #include <atlctl.h>
    #include "resource.h"       // main symbols
    #include "MyAtlDllCP.h"
    #define WM_TASK_FINISH  (WM_USER + 101)
    class ATL_NO_VTABLE CMyAtl : 
    public CWindowImpl<CMyAtl>,
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMyAtl, &CLSID_MyAtl>,
    public IConnectionPointContainerImpl<CMyAtl>,
    public IDispatchImpl<IMyAtl, &IID_IMyAtl, &LIBID_MYATLDLLLib>,
    //begin
    public IObjectSafetyImpl<CMyAtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER>,
    public IProvideClassInfo2Impl<&CLSID_MyAtl, &DIID__IMyAtlEvents, &LIBID_MYATLDLLLib>,
    //end
    public CProxy_IMyAtlEvents< CMyAtl >{
    public:
    CMyAtl()
    {
    }DECLARE_REGISTRY_RESOURCEID(IDR_MYATL)DECLARE_PROTECT_FINAL_CONSTRUCT()BEGIN_COM_MAP(CMyAtl)
    COM_INTERFACE_ENTRY(IMyAtl)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IConnectionPointContainer)
    COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
    //begin
    COM_INTERFACE_ENTRY(IObjectSafety)
    COM_INTERFACE_ENTRY(IProvideClassInfo)
    COM_INTERFACE_ENTRY(IProvideClassInfo2)
    //end
    END_COM_MAP()
    BEGIN_CONNECTION_POINT_MAP(CMyAtl)
    CONNECTION_POINT_ENTRY(DIID__IMyAtlEvents)
    END_CONNECTION_POINT_MAP()
    public:
    STDMETHOD(InitTask)(long number);
    private:
    long m_ForHtml;
    public:
    long m_number;
    DECLARE_WND_CLASS("MyAtl")

    BEGIN_MSG_MAP(CMyAtl)
    MESSAGE_HANDLER(WM_TASK_FINISH, OnTaskFinished)
    END_MSG_MAP()
    public:
    STDMETHOD(get_ForHtml)(/*[out, retval]*/ long *pVal);
    STDMETHOD(put_ForHtml)(/*[in]*/ long newVal);
    LRESULT OnTaskFinished(UINT uMsg, WPARAM wParam,
    LPARAM lParam, BOOL& bHandled)
    {
    Fire_TaskFinished((long)wParam);
    Fire_NoParam();
    return 0;
    }
    HRESULT FinalConstruct()
    {
    RECT rect;
    rect.left=0;
    rect.right=100;
    rect.top=0;
    rect.bottom=100;
    m_ForHtml = 0;
    HWND hwnd = Create( NULL, rect, "MyAtlWindow", WS_POPUP);
    if (hwnd)
    return S_OK;
    else
    return HRESULT_FROM_WIN32(GetLastError());
    }
    void FinalRelease()
    {
    if (m_hWnd != NULL)
    DestroyWindow();
    }
    };
    DWORD WINAPI justDoIt(LPVOID lpParameter);
    #endif //__MYATL_H_// //////////////////////////////////MyAtl.cpp : Implementation of CMyAtl
    #include "stdafx.h"
    #include "MyAtlDll.h"
    #include "MyAtl.h"
    DWORD WINAPI justDoIt(LPVOID lpParameter)
    {
    CMyAtl *myAtl = (CMyAtl*)lpParameter;

    long result;
    for (int i = 1; i <= myAtl->m_number; ++i)
    result = i * 2;
    myAtl->PostMessage(WM_TASK_FINISH,result,0);
    return 0;
    }
    STDMETHODIMP CMyAtl::InitTask(long number)
    {
    HANDLE hThrd;
    DWORD tid;
    m_number = number;
    if((hThrd = CreateThread(
    0,
    0,
    (LPTHREAD_START_ROUTINE)justDoIt,
    (void *)this,
    0,
    &tid)) == NULL)
    {
    //error handling here
    }
    CloseHandle(hThrd);
    return S_OK;
    }STDMETHODIMP CMyAtl::get_ForHtml(long *pVal)
    {
    *pVal = m_ForHtml;
    return S_OK;
    }STDMETHODIMP CMyAtl::put_ForHtml(long newVal)
    {
    m_ForHtml = newVal;
    return S_OK;
    }
    <html>
    <BODY  TOPMARGIN="0" LEFTMARGIN="0">
            <input id=textOutput name=textOutput>  
            <input id=TaskFinished_label name=TaskFinished_label> 
            <input id=noparam_label name=noparam_label>
    <OBJECT classid="clsid:4E17685A-AADE-4217-BB7A-ADAA530B26A4" 
    id=myatlobj 
    name=myatlobj  
    width="200" 
    height="200" 
    >               
            
    </OBJECT>          
    <button onclick="InitTask()" id="InitTask" name="InitTask" value="InitTask">InitTask</button><SCRIPT LANGUAGE="JScript">
    function clickIt(result)  
    {
        txtOutput.value = result;
    }
    function InitTask()  
    {
        myatlobj.InitTask(1111);
        
    }function set_label_text(obj,textvalue)
    {
    obj.value = textvalue;
    }
    </SCRIPT><script language=javascript for="myatlobj" event="NoParam()">
        set_label_text(noparam_label, "NoParam")
    </script>
    <script language=javascript for="myatlobj" event="TaskFinished(arg1)">
        set_label_text(TaskFinished_label, "TaskFinished")
    </script>
     
    </body>
    </html><html>
    <BODY onclick="myatlobj.InitTask(1111)" TOPMARGIN="0" LEFTMARGIN="0">
            <input id=textOutput name=textOutput>  
            <input id=textOutput1 name=textOutput1> 
    <OBJECT ID="myatlobj" <
    CLASSID="CLSID:4E17685A-AADE-4217-BB7A-ADAA530B26A4">
    >
    </OBJECT><SCRIPT LANGUAGE="VBScript">
    <!--
    Sub myatlobj_NoParam()
       myatlobj.ForHtml = myatlobj.ForHtml + 1
    End Sub-->
    </SCRIPT>
     
    </body>
    </html>