문제

나는 적절하고 싶다 Idispatch 그런 다음 포인터를 캐스팅합니다 cmydispatch 포인터와 나중에 내 길을 가졌습니다.

즉 JavaScript에서 나는 다음과 같은 일을하고 싶습니다.

var x = external.obj.x;
var y = external.obj.y;
external.obj.x = 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_Propertyput 깃발을 얻고 싶습니다 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 바늘? 고맙습니다.

도움이 되었습니까?

해결책

인터페이스에서 구체적인 구현으로 다운 캐스팅은 Doom으로가는 도로의 첫 번째 단계입니다.

즉, JavaScript와 COM 객체가 다른 아파트에서 실행되지 않는 한, 당신이하고있는 일은 효과가 있어야하며, 당신은 실제 객체 대신 대리를 통과합니다.

다운 캐스트 해야하는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top