牛人救助!ActiveX在IE11下面的诡异问题

tttk 2014-12-24 10:24:21
我用vc++写的一个ActiveX,有一个属性定义为IDispatch*接口,定义如下:

[propget, id(7), helpstring("property onStatus")]
HRESULT OnStatus([out, retval] IDispatch* *pVal);
[propput, id(7), helpstring("property onStatus")]
HRESULT OnStatus([in] IDispatch* newVal);

在IE中调用如下:

function onStatus() {...}

wordctl = new ActiveXObject("WebHelperX.Doc2HtmlCtl");
wordctl.OnStatus = onStatus;
wordctl.OnStatus(); // 问题行

IE6-IE8,运行正常。
但是测试IE11时,问题行就崩溃。

STDMETHODIMP CDoc2HtmlCtl::get_OnStatus(IDispatch **pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

*pVal = m_pWndHidden->m_pOnStatus;

return S_OK;
}

STDMETHODIMP CDoc2HtmlCtl::put_OnStatus(IDispatch *newVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())

CreateHiddenWindow();
m_pWndHidden->m_pOnStatus = newVal;

return S_OK;
}
接口定义非常简单,就是把IDispatch指针保存在本地

在IE11中,不知道为什么这个IDispatch指针就莫名其妙的丢失。而且是刚刚附完值的情况。

百思不得其解,烦请高手救助
...全文
161 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tttk 2014-12-24
  • 打赏
  • 举报
回复
非常感谢,问题解决 m_pWndHidden->m_pOnStatus = newVal; m_pWndHidden->m_pOnStatus->AddRef();
Saleayas 2014-12-24
  • 打赏
  • 举报
回复
赋值以后,添加一个 AddRef。
tttk 2014-12-24
  • 打赏
  • 举报
回复
IDispatch* m_pOnStatus;
fly4free 2014-12-24
  • 打赏
  • 举报
回复
m_pOnStatus 是什么类型的?
tttk 2014-12-24
  • 打赏
  • 举报
回复
难道跟这行有关: AFX_MANAGE_STATE(AfxGetStaticModuleState())
tttk 2014-12-24
  • 打赏
  • 举报
回复
补充: 在 CDoc2HtmlCtl::put_OnStatus(IDispatch *newVal) 中增加以下测试代码: m_pWndHidden->m_pOnStatus->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, &errInfo, &errIndex); 在javascript中执行: wordctl.OnStauts = onStatus; javascript中的onStatus函数被成功调用。表明ActiveX传入的Idispatch*指针没有问题。

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧