我有个程序多个地方creat,调用,free一些ActiveX控件,奇怪的时候有时候关闭窗体的时候有时候会产生内存地址访问出错,有时候却不会产生。

解决方案 »

  1.   

    activeX控件用得少, 不大确定, 但请看看这个文章, 或许有帮助
    http://www.delphibbs.com/delphibbs/dispq.asp?lid=347350
      

  2.   

    说明一下, TWebBrowser的问题, 我曾经尝试过通过activex直接衍生控件, 但是问题依旧, 应该是TOleControl的实现有问题. 照那个文章改一下应该可以. (这个bug存在了好几年, 但是知道的人不多)
      

  3.   

    虽然是ActiveX,其实我主要用在delphi上的,不是web上
      

  4.   

    不是ActiveX方式的问题,估计的代码写的有问题,再仔细检查看看。
      

  5.   

    ActiveX是MS的标准文件,它跟DLL是一样的。前几年,我用的时候,也老是出错,找了不少资料,才发现跟ACTIVEX和DLL等文件的原始创建模式有关系,以及在D中声明变量的位置也有关系。
    如私有的,保护的,窗体内部的,本应用(如DLL,OCX等文件,做为Application中的一个被调用文件)和主应用Applicaiton中声明,都有关系。。举个简单的例子,如下:
    private
      function NewInstance(InstanceName: String): IMyActiveX;
      procedure FreeInstance(ActiveXInstance: IMyActiveX);function MyForm.NewInstance(InstanceName: String): IMyActiveX;
    var
      MyActiveX: IMyActiveX;       // 内部声明变量
    begin
      MyActiveX := CoMyActiveX.Create;
      .........
      Result := MyActiveX;
    end;procedure MyForm.FreeInstance(ActiveXInstance: IMyActiveX);
    begin
      if ActiveXInstance <> Nil then  
        ActiveXInstance := Nil;
    end;在DELPHI的环境中,释放内存就很正常,前提是IMyActiveX在自身的设计时,Destroy要正常。Pub.pas的全局中声明
      MyActiveX: IMyActiveX;       // 全局声明变量MyFrom.Pasprivate
      function NewInstance(InstanceName: String): IMyActiveX;
      procedure FreeInstance(ActiveXInstance: IMyActiveX);function MyForm.NewInstance(InstanceName: String): IMyActiveX;
    begin
      MyActiveX := CoMyActiveX.Create;
      MyActiveX.Init;      //初始化
      .........
      Result := MyActiveX;
    end;procedure MyForm.FreeInstance(ActiveXInstance: IMyActiveX);
    begin
      if ActiveXInstance <> Nil then  
        ActiveXInstance := Nil;
    end;在主Application,如果简单的声明一个MyActiveX: IMyActiveX;  ,这时候,你创建
    MyActiveX时,发现MyActiveX不要初始化就可以正常使用了。如有个MyPro的属性,发现和MyForm中的是一样的。当MyForm中执行FreeInstance后,如果在Application有其他地方调用它,
    肯定要出错的。释放内存异常。
      

  6.   

    原理是COM+在内存中声明,有个变量名和一块地址。如果是公用的变量,在同一个应用程序中,在其他的模块中,只要声明变量,就会同用这一块地址。具体参看MS的COM+资料
      

  7.   

    虽然是ActiveX,其实我主要用在delphi上的,不是web上
    --------------------------------------------------我引用TWebBrowser是说明TWebBrowser本身作为ActiveX控件也具有这个问题(TWebBrowser是从TOleControl继承而来的ActiveX控件, Delphi对于ActiveX控件的封装有很大问题), 并不是认为你把ActiveX控件用在了网页上, 不要误会. 所以请参照那个帖子的最后一个回复试试.
      

  8.   

    ScriptBaby(Kanna·Naraku)
    我曾经尝试过通过activex直接衍生控件, 但是问题依旧, 应该是TOleControl的实现有问题. 照那个文章改一下应该可以. (这个bug存在了好几年, 但是知道的人不多)这贴虽然结了,可我对你的这个说法不赞同。
    activex也是标准的32位应用程序,跟DLL和EXE是一样的。只是包装不一样。
    从MS的这层定义来说,你的说法不太对。
    从DELPHI来说,EXE/OCX/DLL都很稳定。也许你应该更多的去了解activex的内容,再来下这个结论。
      

  9.   

    虽然隔了将近1年, 并且现在用delphi的人或许不多了
    但这是个严肃的问题, 而且是困扰了很多Delphi程序员多年的问题, 如果您没有理解我引用的文章, 也没有亲自实验过, 请别用一副自己什么都知道的口气“从MS的这层定义来说,你的说法不太对。”
    我不知道我说了什么和“从MS的这层定义来说”有冲突的东西“从DELPHI来说,EXE/OCX/DLL都很稳定。”
    不知道您这种看法是怎么得出来的,Delphi的VCL具有很多Bug是事实,您没碰到过不代表没有问题“也许你应该更多的去了解activex的内容,再来下这个结论。”
    您真的明白我的结论是什么吗?您确定您对ActiveX的了解比我多吗?您真的看懂了我引用的那篇文章了吗?这个问题我反复实验了许多次(还有zhongs的经验),如果您想否认这种可能性,拿测试结果来老实说我最讨厌您这样游离的论战方法了。
      

  10.   

    顶你!!哈哈,ActiveX毛病太多了!!浏览器的多窗口运行模式跟一个窗口多个浏览页面的运行模式,在ActiveX的多线程应用时有着不同的区别!貌似多个浏览页面共享一个浏览器窗口所分配的资源,只是我的猜想,具体的说不好!!郁闷!