著作一覧 |
エラーを通知するためのイベントを実装したいとする。
<object id="axc" classid="..." codebase="/..."></object>
に対して
document.getElementById('axc').onfailure = function(code) { alert(code); };
と呼べるようにするということだ。
IDLには以下のように定義する。
[propput]HRESULT OnFailure([in]IDispatch* pdisp);
コードは以下のようにする。
CComPtr<IDispatch> m_Failure; HRESULT put_OnFailure(IDispatch* pdisp) { if (!pdisp) return E_POINTER; return pdisp->QueryInterface(IID_IDispatch, &m_Failure); }
(COMでは大文字小文字は無視されるので、IDLには慣習に従って大文字開始のキャメルケース、JavaScriptでは小文字で書いている)
イベントは以下のように通知する。
VARIANTARG vec; VariantInit(&vec); vec.vt = VT_I4; vec.intVal = m_errorCode; DISPPARAM disp = { 1, 0, &vec, NULL }; VARIANT vResult; VariantInit(&vResult); try { if (pdisp->Invoke(DISPID_VALUE, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &disp, &vResult, NULL, NULL) == S_OK) { ... } } catch (...) { } VariantClear(&vResult);
DISPIDにはDISPID_VALUEを指定する。
ジェズイットを見習え |