しまてく

学んだ技術を書きためるブログ

自作COMからJavaScript/vbscriptへのコールバック

自分が作ったCOM(ActiveX)から呼び出し元のスクリプトにコールバック
できないもんかと試行錯誤の結果、なんとかできたので忘れないようにメモ。

CMyActiveX クラスの場合

COM側

ヘッダ
/*MyActiveX.h*/
public IConnectionPointContainerImpl<CMyActiveX>
//↑こんな感じで「IConnectionPointContainerImpl」を継承して実装する

//COM_MAP や CONNECTION_POINT_MAP はまぁ適当に。
ソース
/*MyActiveX.cpp*/
// コールバックファンクションの設定
// 引数は IDispatch* 型で関数オブジェクトを受ける↓
STDMETHODIMP CMyActiveX::setCallBackFunction(IDispatch* func)
{
	m_callBackFunction = func;

	return S_OK;
}

// コールバックファンクションの発動
HRESULT CMyActiveX::FireCallBackFunction(void)
{
	HRESULT hr;
	if( m_callBackFunction )
	{
		hr = m_callBackFunction.Invoke0( (DISPID)DISPID_VALUE );
	}
	
	return hr;
}

これでスクリプト側からは関数オブジェクトを渡せばCOM内の任意のタイミングで
コールバックを発動することが可能になります!

クライアント側

JavaScriptの場合
function hoge(){
	//何かの処理
}

// ↑だったら hoge が関数オブジェクトです。
vbscriptの場合
Function piyo()
	'何かの処理
End Function

' ↑だったら GetRef("piyo") が関数オブジェクトです。

コールバックできた時はすごい嬉しかったけど実際あんま使ってないですw