トップ «前の日記(2010-01-14) 最新 次の日記(2010-01-16)» 編集

日々の破片

著作一覧

2010-01-15

_ DHTMLコントロールのイベント処理

エラーを通知するためのイベントを実装したいとする。

 <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を指定する。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え