我做的系统结构为:MDI_Form + ActiveX Dll。在ActiveX Dll 中会显示Form,我把Form嫁接给MDI,作为它的MdiChild窗口。Form中有用new生成的数据结构。
当程序退出时(我已经调试跟踪到MDI_UnLoad执行成功。)出现系统出错!
请各位高手帮我分析,会在什么情况下出错!
说明:
  1,嫁接ActiveX Dll中的Form为MDI_Form的子窗口方式为:SetParent
  2,new出来的对象我都用Set nothing。不过可能会有漏掉的。

解决方案 »

  1.   

    那么你在form的一个terminate还是哪个事件,(我不记得了,我这边没有vb)。
    form unload后面还有一个事件的,你查一下
      

  2.   

    出现的是不是内存***不能为read?如果是,就检查一下你所有的过程参数的byref或没有前缀的变量,尤其是带有optional的,看看他们是否都有指针传入,因为在vb退出后,可能会有这些指针的delete,如果指针为空,会出现内存不能访问的错误。用dll时,尤其要注意,在传入的过程中,不管是不是new(因为dll自身没有实例,所以一旦调用,就是new过程),一定要用api或其他把参数obj delete掉
      

  3.   

    SetParent
    不用 new 了就可以了,不过全部要Set dd=  nothing
      

  4.   

    樓上高見,我已經出N次這樣的錯誤了!不知道樓主講的"出錯"是不是這種錯誤?
    "用dll时,尤其要注意,在传入的过程中,不管是不是new(因为dll自身没有实例,所以一旦调用,就是new过程),一定要用api或其他把参数obj delete掉"
    恕小弟愚昧,這句話的意思不大明白, Kivic(享受·生活) 能否再詳細的講講怎麼才能避免出這樣的錯誤呢???(不好意思,借樓主的地盤先謝過了)
      

  5.   

    可能是SetParent的问题下面是SetParent的说明:指定一个窗口的新父(在vb里使用:利用这个函数,vb可以多种形式支持子窗口。例如,可将控件从一个容器移至窗体中的另一个。用这个函数在窗体间移动控件是相当冒险的,但却不失为一个有效的办法。如真的这样做,请在关闭任何一个窗体之前,注意用SetParent将控件的父设回原来的那个)
      

  6.   

    谢谢大家的关注:!
    to:rainstormmaster(rainstormmaster)
    我有在unload之前,用SetParent还原起父窗口!
    to:Kivic(享受·生活)  
    出现的就是内存...不能read
    我试试看!
    另外,请教一下,在调试状态下,能否看见object的delete过程!to: arvid_gs(west)
    在VB里面,不用new来实现,确实非常之难!
    我原来使用C++做程序的,一直觉得VB应该很好使,可是,VB掩盖了编程的许多核心的东西,不是那么随心应手!谢谢大家的关注!我明天再来,一旦解决,我会迅速结贴给分!
    (虽然大家在这里帮我并不是为了这点分)
      

  7.   

    有结果!
    导致这个问题的原因如下:
    我在系统上装了Visual Studio .NET。应该是它导致的问题
    报错如下:
    AppName: reportsystem.exe  AppVer: 1.0.0.0  ModName: ntdll.dll
    ModVer: 5.1.2600.1106  Offset: 00001d24
    在别的机子上安装不会有该问题,希望引起大家的注意。
    揭帖了,谢谢各位的热心帮助!
      

  8.   

    其实你遇到的问题确实是系统内存管理安全隐患,一般不访问到此问题内存是不会报的,只不过你装了调试程序,所以问题就暴露出来了,应该从根源上解决此问题。建议了解一下vc的dll实例化过程
      

  9.   

    还有,千万要小心使用vb的缺省声明(byref),否则,全是指针,而又没有变量的实例,很容易出现这种错误。
    另外,实例化过程指由静态声明创建一段内存空间(new)从而转向动态运行的过程