【求助】谁有研究过SMP(开源杀软)????
<p>为什么我下过来后 运行扫描时出现 错误?</p><p> </p>
<p>试了好几次都这样</p>
<p>附件上传了 大家看看啥问题</p>
<p>头一次死在<font face="Verdana">MakeStartReporting<br/>第二次在CalcFileNow</font></p>
<p>第三次没找到原因</p>
<p> </p>
<p>不过这个为什么会导致出错??</p>
<p><font face="Verdana">Sub CalcFileNow()<br/> nFile = 0<br/> nInfect = 0<br/> nRepair = 0<br/> nCalcFiles = 0<br/> Dim strPath As String<br/> Dim extNow As String<br/> strPath = FixPath(frmMain.txtLocation.Text)<br/> strSavePath = strPath & "...\"<br/> extNow = Left$(frmMain.cboExt, 5)<br/> If frmMain.optAllFiles.Value = True Then<br/> PathExt = vbAllFiles<br/> SearchFile strPath<br/> Else<br/> UseFileSpec = True<br/> FileSpec = extNow<br/> PathExt = FileSpec<br/> SearchFile strPath<br/> UseFileSpec = False<br/> End If<br/>End Sub</font></p>
<p> </p><br/> <p>要如何操作才能重现你的问题?</p>
<p> </p>
<p>我这里试了扫描功能,貌似没啥问题.</p>
<p> </p>
<p>另,这个代码的操作手感还不错!</p> 难道是我的CPU的问题?你扫描C盘看看 <p>我还没进行过全盘扫描.</p>
<p> </p>
<p>不过堆栈空间溢出,一般来说是调用层数过深造成的,比如递归,一不小心就会溢出的....</p>
<p> </p>
<p>从这个代码来看,其中的扫描过程<font face="Verdana">SearchFile</font>()并没有考虑到递归层数问题,而是一有子目录就扫描.</p>
<p> </p>
<p>因此目录过多时,肯定会导致递归层数过多,堆栈里需要压入每个调用时的参数,当然就有溢出的可能了.</p>
<p> </p>
<p>我估计了一下,按VB编译后默认1MB的堆栈以及每次入栈1个参数来算,假如全部堆栈都用于这个递归,则262144次入栈后就会溢出,不知道算对没,哈哈.</p>
<p> </p>
<p>而实际上还有很多其它函数调用也在使用堆栈,因此实际能供递归使用的堆栈应该更少.</p>
<p> </p>
<p>对这个程序,我的建议是进行递归层数限制,让其每次的递归都保持在一定的量,比如10层目录,再深就先保存下来,等待本次递归完成后再进行下一次递归.</p>
<p> </p>
<p>另外,还有两个方案,是更改堆栈大小的方案.</p>
<p> </p>
<p>一是,更改LINK.EXE的参数,加入<font face="Verdana">/STACK开关,设置堆栈的大小,看MSDN里说是最大4MB,就是4194304字节(<font face="Verdana">/STACK:4194304</font>);</font></p>
<p> 这在VB里面不好办的,因为VB不支持编译参数指定.</p>
<p> </p>
<p>二是,使用X<font face="Verdana">:\Program Files\Microsoft Visual Studio\VC98\Bin\EDITBIN.EXE这个微软提供的工具来改变<strong><font color="#0000ff">编译后EXE</font></strong>的堆栈大小,参数与LINK.EXE是一样的.</font></p>
<p> </p>
<p>另,国庆中秋双节快乐,哈~~~~~~~~</p> 我把错误图片发上来<br/>
页:
[1]