none
请教: 使用CComQIPtr<IHTMLElementCollection> pIHTMLEC 去获得页面元素值,需要detach()的原因 RRS feed

  • 问题

  • 大家好,有一个问题找不到答案,请您帮忙,谢谢!

    我在编写一个网页数据摘取程序,采用的思路是:

    1、在一个函数里面,通过

    CComPtr<IShellWindows> spShellWin、

    CComQIPtr<IWebBrowser2> spBrowser、

    CComQIPtr<IHTMLDocument2> spDocument2、

    CComQIPtr <IHTMLElement> pIHTMLE、

    CComQIPtr<IHTMLElementCollection> pIHTMLEC

    去获取页面数据。

    2、在一个循环中,自动打开一个网页,使用上面的函数获取页面数据后,自动打开下一个网页,继续使用上面的函数获取数据,......

    问题是,当程序自动打开第二个网页时,如果不使用pIHTMLEC.Detach(),程序会出现断言错误,这是为什么?

    只有它需要Detach,其他指针不Detach程序仍能运行且结果正常,我的第二个问题是,如果现象是这样,是否意味着其他指针就是不用Detach,还是说也需要,否则会出现潜在的问题?

    谢谢!

    2015年2月16日 8:52

答案

  • 当你不再需要这个指针了,那么你就要调用detach函数来分离对象和指针。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 神山 2015年2月20日 0:19
    2015年2月17日 9:42

全部回复

  • 当你不再需要这个指针了,那么你就要调用detach函数来分离对象和指针。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 神山 2015年2月20日 0:19
    2015年2月17日 9:42
  • Moderator,非常感谢:)
    2015年2月20日 0:20
  • Detach通常都不需要,COM用完了要做的是Release(对于ATL的指针来说,则是将指针设置为NULL,或者让析构函数自动来做清除工作)。

    你有断言错误应该看断言是什么位置。比如在循环中重用智能指针对象的话,可能会出现断言,因为如果你将指针设置为新的值而不将旧的值Release掉,会出现对象泄漏。



    Visual C++ MVP


    2015年2月20日 22:21
    版主