我想获得一个正确的 IDispatch 指针,然后将其强制转换为 CMyDispatch 指针并稍后使用它。
即。在javascript中我想做这样的事情:
var x = external.obj.x;
var y = external.obj.y;
external.obj.x = y;
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 实例,其中包含 y 值
使用以下代码时, 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 指针? 谢谢。
答案 0 :(得分:1)
你真的不应该,从一个接口转向一个具体的实现是走向灭亡之路的第一步。
那就是说,你正在做的事情应该有效,除非javascript和COM对象在不同的公寓中运行,并且你得到一个代理传递给你,而不是真实的对象。
你为什么需要垂头丧气?