为何Variant.vt = vt_l4,varIndex.lVal = 0时生成的debug版本报异常

trickglom 2012-03-18 01:49:34

...

CComQIPtr<IHTMLDocument3,&IID_IHTMLDocument3> spDoc3;
spDoc3 = pDocDispatch;

HRESULT hr;

CComQIPtr<IHTMLElementCollection,&IID_IHTMLElementCollection> spTargetItems;
CComQIPtr<IHTMLElement,&IID_IHTMLElement> spTargetItem;

...

CComBSTR tagName("TABLE");
hr = spDoc3->getElementsByTagName(tagName,&spTargetItems);

long len;
spTargetItems->get_length(&len);
long i;
LPDISPATCH pElementDisp;

CComVariant varIndex;
varIndex.vt = VT_I4;
for (i=0;i<len;i++)
{
varIndex.lVal = i; //这一句在Debug版本中抛出异常,说是expression p==0 ,
//但在release版本中没有问题
//如果将i的初值设为1【for (i=1;i<len;i++)】,就没有这种问题,这是WHY?
hr = spTargetItems->item(varIndex,varIndex,&pElementDisp);
hr = pElementDisp->QueryInterface(__uuidof(IHTMLElement),(void**)&spTargetItem);
...
}
...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
蒋晟 2012-03-30
  • 打赏
  • 举报
回复
因为搬到外面跳过了析构函数,造成assert
蒋晟 2012-03-18
  • 打赏
  • 举报
回复
……你直接改写p的值做什么?想泄漏COM对象?
trickglom 2012-03-18
  • 打赏
  • 举报
回复
还是局部变量的问题
“CComQIPtr<IHTMLElement,&IID_IHTMLElement> spTargetItem;”这一句调整到for循环体内就没问题了。
这纯粹是一个意外的发现,我是完全不知道原理的。只是觉得有根据需要重新考量变量的作用范围,尽量使用局部变量,清理一下,便解决了这个问题,完全不知道WHY。
trickglom 2012-03-18
  • 打赏
  • 举报
回复
找着了,ATLBASE.h 里有这么一段

T** operator&()
{
ATLASSERT(p==NULL);
return &p;
}

这不是蛋疼么...
trickglom 2012-03-18
  • 打赏
  • 举报
回复
循环体内声明的变量是局部变量的说。
不过不太明白“直接改写p的值做什么?想泄漏COM对象?”这一说。
trickglom 2012-03-18
  • 打赏
  • 举报
回复
蒋老大回来了:):):)
要这么写么?

for (i=0;i<len;i++)
{
CComVariant varIndex;
varIndex.vt = VT_I4;
varIndex.lVal = i; //这一句在Debug版本中抛出异常,说是expression p==0 ,
//但在release版本中没有问题
//如果将i的初值设为1【for (i=1;i<len;i++)】,就没有这种问题,这是WHY?
hr = spTargetItems->item(varIndex,varIndex,&pElementDisp);
hr = pElementDisp->QueryInterface(__uuidof(IHTMLElement),(void**)&spTargetItem);
...
}

菜鸟的说:
看人家书上是这么写的。但CComVariant varIndex;这一句在循环体内,算是重复声明变量么?
还有,可不可以强制不调试“varIndex.lVal = i;”,因为这一句在当前条件下没问题的。

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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