读书人

求教ActiveX控件怎么尽量避免内存地址

发布时间: 2012-04-01 17:23:46 作者: rapoo

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

[解决办法]
activeX控件用得少, 不大确定, 但请看看这个文章, 或许有帮助
http://www.delphibbs.com/delphibbs/dispq.asp?lid=347350
[解决办法]
不是ActiveX方式的问题,估计的代码写的有问题,再仔细检查看看。
[解决办法]
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.Pas

private
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有其他地方调用它,
肯定要出错的。释放内存异常。

读书人网 >.NET

热点推荐