在ActiveX控件中触发自定义事件会导致IE崩溃

时间:2013-11-30 21:00:48

标签: c++ mfc activex custom-events

在我的ActiveX控件中,使用类向导,我添加了一个名为OutboundCallStateChanged的自定义事件。它在我的OLEControl类中生成了以下内容:

.h文件

    class CIVR60Ctrl : public COleControl
    {
    ...
    public:

// Event maps
        //{{AFX_EVENT(CIVR60Ctrl)
        void FireOutboundCallStateChanged()
            {FireEvent(eventidOutboundCallStateChanged,EVENT_PARAM(VTS_NONE));}
        //}}AFX_EVENT
        DECLARE_EVENT_MAP()
    ...
    }

    // Dispatch and event IDs
    public:
        CMainDialog m_MainDialog;
        enum {
        //{{AFX_DISP_ID(CIVR60Ctrl)
        dispidToolTipText = 1L,
        dispidDial = 4L,
        dispidGetOutboundCallState = 6L,
        ...  
        dispidGetUserStatus = 13L,
        eventidOutboundCallStateChanged = 1L,
        //}}AFX_DISP_ID
        };
    };

在.cpp文件中:

// Event map

BEGIN_EVENT_MAP(CIVR60Ctrl, COleControl)
    //{{AFX_EVENT_MAP(CIVR60Ctrl)
    EVENT_CUSTOM("OutboundCallStateChanged", FireOutboundCallStateChanged, VTS_NONE)
    //}}AFX_EVENT_MAP
END_EVENT_MAP()

好的,非常好。现在当我尝试从另一个类(我认为是COM对象)中使用该函数时,这样:

pMainClass->p_IVRCtrl->FireOutboundCallStateChanged();

IE8只是崩溃并告诉我它恢复了标签。当我在IVR60Ctrl类中激活它时;我认为它正在发挥作用。

在第一种情况下,我认为该调用会引发异常。我不知道是什么样的;我只能用catch(...)来抓住它。谁能告诉我为什么它可能无法正常工作;这会抛出什么类型的异常,以便我能抓住它?

编辑:我设法通过从新线程调用FireOutboundCallStateChanged()来避免异常。现在它并没有崩溃,但我不确定当我触发它时,事件是否真的在IE中引发。如何检查事件是否到达IE?

现在在.html文件中我尝试以下内容:

        <OBJECT name="ivr" ID="IVR601" WIDTH=973 HEIGHT=52 align="top"
            CODEBASE="IVR60.ocx"
            CLASSID="CLSID:01B5BC0F-A51D-4C47-B3E9-3DA1099750CE"
style="position:absolute; top:2px; left:10px;">
            <PARAM NAME="_Version" VALUE="65536">
            <PARAM NAME="_ExtentX" VALUE="23865">
            <PARAM NAME="_ExtentY" VALUE="2164">
            <PARAM NAME="_StockProps" VALUE="0">
        </OBJECT> 
        <script type="text/javascript">
            var ocx = IVR601;       

            function ivr::OutboundCallStateChanged(){
                alert("fired");
            }
        </script> 

但是当我从ActiveX对象中调用FireOutboundCallStateChanged()时,我没有收到警报,所以我不知道我是否能够抓住这个事件,或者它是不是#39}提升了。

0 个答案:

没有答案