在我的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}提升了。