dispparams에서 적절한 idispatch를 얻을 수 있습니까?
문제
나는 적절하고 싶다 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 객체가 다른 아파트에서 실행되지 않는 한, 당신이하고있는 일은 효과가 있어야하며, 당신은 실제 객체 대신 대리를 통과합니다.
다운 캐스트 해야하는 이유는 무엇입니까?
제휴하지 않습니다 StackOverflow