none
msdn里面的 walkall.exe 会导致内存泄露? RRS feed

  • 常规讨论

  • msdn里面的 walkall.exe 会导致内存泄露?


    WalkAll Source:
    http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/walkall/default.asp


    当我用WalkAll.exe打开 1.htm,我发现m_pMSHTML->Release();会失效,导致m_pMSHTML无法释放。1.htm的代码如下:

    <select xxx=888 style="font-size: 12px; width: 72px;" id="wps">
    <option selected="selected" value="xx">xx</option>
    </select>
    <script type="text/javascript">
    function test(){
    var wps=document.getElementById("wps");
    wps.onchange=function(){var index=this.options[this.selectedIndex].value; }
    }
    test();
     </script>



    以下是我的测试步骤:
    step 1:
    打开 walkall.cpp,找到以下代码:


        case DISPID_AMBIENT_DLCONTROL:
            V_VT(pVarResult) = VT_I4;
             V_I4(pVarResult) =  DLCTL_DOWNLOADONLY |
                                 DLCTL_NO_SCRIPTS |
                                 DLCTL_NO_JAVA |
                                DLCTL_NO_DLACTIVEXCTLS |
                                DLCTL_NO_RUNACTIVEXCTLS;
            break;
        case DISPID_AMBIENT_USERMODE:
            // put MSHTML into design mode
            V_VT(pVarResult) = VT_BOOL;
            V_BOOL(pVarResult) = VARIANT_FALSE;


    修改成以下代码,让walkall支持javascript:


        case DISPID_AMBIENT_DLCONTROL:
            // respond to this ambient to indicate that we only want to
            // download the page, but we don't want to run scripts,
            // Java applets, or ActiveX controls
            V_VT(pVarResult) = VT_I4;
             V_I4(pVarResult) =  DLCTL_DOWNLOADONLY |
                                 // DLCTL_NO_SCRIPTS |  //注释掉这里
                                 DLCTL_NO_JAVA |
                                DLCTL_NO_DLACTIVEXCTLS |
                                DLCTL_NO_RUNACTIVEXCTLS;
            break;
        case DISPID_AMBIENT_USERMODE:
            // put MSHTML into design mode
            // V_VT(pVarResult) = VT_BOOL;   //注释掉这里
            // V_BOOL(pVarResult) = VARIANT_FALSE;  //注释掉这里




    step 2:
    用 walkall.exe 打开 1.htm,会发现 "CApp::Release()" 永远运行不到 "--m_dwRef == 0".所以会导致CApp无法释放。


    STDMETHODIMP_(ULONG) CApp::Release()
    {
        TCHAR szBuff[255];

        if (--m_dwRef == 0)
        {
            ODS("Deleting CApp\n");
            delete this;
            return 0;
        }

      // CODE REVIEW: Replace Banned API.
      // wsprintf(szBuff, "CApp refcount reduced to %d\n", m_dwRef);
      StringCchPrintf(szBuff, 255, "CApp refcount reduced to %d\n", m_dwRef);
        ODS(szBuff);
        return m_dwRef;
    }





    请问这是为什么?

    ltxxx
    2009年8月12日 3:26

全部回复