質問

きちんとしたものを手に入れたい 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 オブジェクトが別のアパートメントで実行され、実際のオブジェクトの代わりにプロキシが渡される場合を除き、やっていることは機能するはずです。

なぜダウンキャストする必要があるのですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top