描述:
这个是一个关于external和页面交换的问题
dll程序
STDMETHODIMP CImpIDispatch::Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID /*riid*/,
/* [in] */ LCID /*lcid*/,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS* pDispParams,
/* [out] */ VARIANT* pVarResult,
/* [out] */ EXCEPINFO* /*pExcepInfo*/,
/* [out] */ UINT* puArgErr)
{
if(dispIdMember == DISPID_CB_IsOurCustomBrowser)
{
if(pDispParams->rgvarg[0].vt & VT_VARIANT)
{
pDispParams->rgvarg[0].vt = VT_VARIANT;
pDispParams->rgvarg[0].pvarVal->vt = VT_BSTR | VT_BYREF;
*pDispParams->rgvarg[0].pvarVal->pbstrVal = SysAllocString(L"你好");
}
}
........
.......
}
页面
var str = "";
Window.External.Action(str);
alert(str);应该弹出 “你好”字符
但是不能显示 谁能指点,谢
解决方案1:
js中调用方法时参数没有byref关键字(VBS中是有的),如果要让js知道传递的参数是用作接收数据的([out]属性),你必须在实现IDispatch的同时也实现ITypeInfo,要么在代码中手工创建ITypeInfo,要么在注册表中注册你的接口,否则js会把所有参数解释成传入(in)参数,最多只有一个返回值。
另一种解决方案,使用PROPERTYGET调用,但是跟上面我在1楼讲的方法调用原理是一样的。
您可能想查找下面的文章:
- 实现了IDispatch接口的组件和ActiveX控件用起来有什么不同呢?我觉得一样可以用在Web页面上,为什么ActiveX控件还要多实现那么多各种各样
- 实现了IDispatch接口的组建,用vbscript怎么调用?
- IDispatch::Invoke如何通过dispid调用方法?
- 关于idispatch和typelib
- 问个弱弱的问题:得到一个ActiveX控件的IDispatch指针后,如何使用?有没有与CListCtrl相同的ActiveX控件?
- MSFlexGrid有一个Picture属性,是一个IDispatch接口指针,请问如何操作?
- 请教COM,IDispatch相关问题!
- 制作弹出广告拦截器时碰到问题,关于OnNewWindow2IDispatchppDisp,BOOLCancel的
- [关于IDispatch问题]:如何将tlb文件编译进dll中?高分求救
- 请问一下:COM组件(TLB)中使用IDispatch和CoInitialize两种方法有何不同?谢谢啦