我有个程序多个地方creat,调用,free一些ActiveX控件,奇怪的时候有时候关闭窗体的时候有时候会产生内存地址访问出错,有时候却不会产生。
解决方案 »
- 专家请进,在delphi上使用Codejock软件公司的Xtreme Toolkit Pro的控件
- ★★★★怎么能让memo添加数据的时候不滚动呀!!★★★★
- DELPHI如何操作注册表的?
- 使用DELPHI里的ADO组件建立临时表,用不用加#或##的?
- 关于TreeView控件----急救
- 救命啊,delphi6控件BAR上的控件怎么都找不到了?
- 该sql语句如何写
- Delphi 500人的QQ群开放了,高级群号 46722653
- 如何在父类的事件(如onmousedown)中定义代码并在子类中继承
- 如何编写可连断快速监视远程屏幕的程序
- 关于文件的增量备份及传输,高分送出
- 120急救!!Delphi中如何实现全屏窗口??
http://www.delphibbs.com/delphibbs/dispq.asp?lid=347350
如私有的,保护的,窗体内部的,本应用(如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有其他地方调用它,
肯定要出错的。释放内存异常。
--------------------------------------------------我引用TWebBrowser是说明TWebBrowser本身作为ActiveX控件也具有这个问题(TWebBrowser是从TOleControl继承而来的ActiveX控件, Delphi对于ActiveX控件的封装有很大问题), 并不是认为你把ActiveX控件用在了网页上, 不要误会. 所以请参照那个帖子的最后一个回复试试.
我曾经尝试过通过activex直接衍生控件, 但是问题依旧, 应该是TOleControl的实现有问题. 照那个文章改一下应该可以. (这个bug存在了好几年, 但是知道的人不多)这贴虽然结了,可我对你的这个说法不赞同。
activex也是标准的32位应用程序,跟DLL和EXE是一样的。只是包装不一样。
从MS的这层定义来说,你的说法不太对。
从DELPHI来说,EXE/OCX/DLL都很稳定。也许你应该更多的去了解activex的内容,再来下这个结论。
但这是个严肃的问题, 而且是困扰了很多Delphi程序员多年的问题, 如果您没有理解我引用的文章, 也没有亲自实验过, 请别用一副自己什么都知道的口气“从MS的这层定义来说,你的说法不太对。”
我不知道我说了什么和“从MS的这层定义来说”有冲突的东西“从DELPHI来说,EXE/OCX/DLL都很稳定。”
不知道您这种看法是怎么得出来的,Delphi的VCL具有很多Bug是事实,您没碰到过不代表没有问题“也许你应该更多的去了解activex的内容,再来下这个结论。”
您真的明白我的结论是什么吗?您确定您对ActiveX的了解比我多吗?您真的看懂了我引用的那篇文章了吗?这个问题我反复实验了许多次(还有zhongs的经验),如果您想否认这种可能性,拿测试结果来老实说我最讨厌您这样游离的论战方法了。