在我的 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>
但是当我FireOutboundCallStateChanged()
从 ActiveX 对象调用时,我没有收到警报,所以我不知道我是否无法捕获该事件或者它是否根本没有引发。