クラス ウィザードを使用して 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 オブジェクトから呼び出すと、アラートが表示されないため、イベントをキャッチできないのか、イベントがまったく発生していないのかわかりません。