0

適切なIDispatchポインターを取得してから、それをCMyDispatchポインターにキャストし、後でそれを処理したいと考えています。

つまり、JavaScriptで次のようなことをしたい:

var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;

xyCMyDispatchのインスタンスです。

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;
}

DISPATCH_PROPERTYPUTフラグを指定したCMyDispatch.Invoke() ではy値を保持するCMyDispatchインスタンスを取得したいと考えています。

次のコードを使用すると、pDispatchがガベージに設定されます。

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ポインターを取得するにはどうすればよいですか? ありがとうございました。

4

1 に答える 1

1

インターフェースから具体的な実装へのダウンキャストは、運命への道の最初のステップです。

そうは言っても、javascriptとCOMオブジェクトが異なるアパートメントで実行されていて、実際のオブジェクトではなくプロキシが渡されない限り、実行していることは機能するはずです。

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

于 2009-07-16T19:20:09.117 に答える