2009-07-16 12 views
0

私は適切なIDispatchポインターをしたいと思ってのCMyDispatchポインターにキャストし、後で私の方法があります。DISPPARAMSから適切なIDispatchを取得できますか?

つまり、私はこのような何かをしたいJavaScriptで:

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

XYCMyDispatchのインスタンスです。私はY値を保持しているCMyDispatchインスタンスを取得したいDISPATCH_PROPERTYPUTフラグでCMyDispatch.Invoke()

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はjavascriptをこのように返されます。次のコードを使用している場合

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

答えて

1

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

javascriptとCOMオブジェクトが異なるアパートメントで実行され、実際のオブジェクトの代わりにプロキシが渡されない限り、あなたがやっていることはうまくいくはずです。

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

+0

** external.obj.x **プロパティを** y **オブジェクトに設定できるようにしたい、つまり** IDispatch **の実装です。 –

+0

それを行うには、私は正しい場合、具体的な実装イ​​ンスタンスを取得する必要があります、インターフェイスは十分ではありません。 –

+1

私はこのプロキシpDisp-> Invoke()を介して必要なプロパティを取得することができました。それは質問に対する答えではありませんが、問題を提起した問題を解決します。 ありがとうございます。 –

関連する問題