2009-07-16 3 views
0

나는 적절한 것을 얻고 싶다. IDispatch 포인터. 그 다음 그것을 CMyDispatch 포인터에 던져 넣어 라. 그리고 나중에 그것과 함께 나아 간다. 자바 스크립트DISPPARAMS에서 적절한 IDispatch를 얻을 수 있습니까?

즉 나는 이런 식으로 뭔가를 할 :

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

어디 XY의 인스턴스 CMyDispatch 있습니다.

CMyDispatch 자바 스크립트이 방법으로 반환됩니다 에서

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_PROPERTYPUT 플래그 나는 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 포인터를 제대로 얻으려면 어떻게해야합니까? 감사합니다.

답변

1

인터페이스에서 구체적인 구현으로 다운 캐스팅하면 안됩니다. 운명의 첫 번째 단계입니다.

javascript와 COM 객체가 다른 아파트에서 실행되고 실제 객체 대신 프록시가 전달되는 경우를 제외하고는 사용자가하고있는 일이 효과가 있다고합니다.

왜 다운 캐스트해야합니까?

+0

** external.obj.x ** 속성을 ** y ** 객체에 설정하려면 ** IDispatch ** 구현이 가능해야합니다. –

+0

그리고 그것을 수행하려면, 내가 올바른지 구체적인 구현 인스턴스, 인터페이스가 충분하지 않아야합니다. –

+1

이 프록시 pDisp-> Invoke()를 통해 필요한 속성을 가져올 수있었습니다. 그것은 질문에 대한 대답이 아니지만 질문을 제기하는 문제를 해결합니다. 감사합니다. –