| 著作一覧 |
エラーを通知するためのイベントを実装したいとする。
<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を指定する。
ジェズイットを見習え |