DISPPARAMS から適切な IDispatch を取得できますか?
質問
きちんとしたものを手に入れたい IDispatch ポインタを次にキャストします CMyDispatch ポインターを使用して、後で自由に操作してください。
つまりJavaScriptでは次のようなことをしたいです:
var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;
どこ バツ そして y の例です CMyDispatch.
CMyDispatch は次のように JavaScript に返されます。
STDMETHODIMP CMyDispatch::Invoke(DISPID dispIdMember, REFIID, LCID, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO*, UINT*) {
if( pVarResult )
{
CMyDispatch* pDisp = new CMyDispatch();
CComVariant val( pDisp );
val.Detach( pVarResult );
}
return S_OK;
}
で CMyDispatch.Invoke() と DISPATCH_PROPERTYPEPUT 手に入れたいフラグ CMyDispatch 保持するインスタンス y 価値。
次のコードを使用すると、 p派遣 ゴミに設定されています:
STDMETHODIMP CMyDispatch::Invoke(DISPID dispIdMember, REFIID, LCID, WORD wFlags,
DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO*, UINT*) {
ASSERT( pDispParams->cArgs == 1 );
ASSERT( VT_DISPATCH == pDispParams->rgvarg[0].vt );
IDispatch* pDisp = ( pDispParams->rgvarg[0].pdispVal ); // <-- garbage
CMyDispatch* pDispatch = (CMyDispatch*) pDisp; // <-- garbage
return S_OK;
}
きちんとするにはどうすればいいですか CMyDispatch ポインタ?ありがとう。
解決
インターフェイスから具体的な実装へのダウンキャストは、破滅への道の第一歩です。
とはいえ、JavaScript と COM オブジェクトが別のアパートメントで実行され、実際のオブジェクトの代わりにプロキシが渡される場合を除き、やっていることは機能するはずです。
なぜダウンキャストする必要があるのですか?
所属していません StackOverflow