ActiveX 部件关闭

为了创建一个性能良好的部件,必须放弃对部件活动时间的控制。当客户请求对象时,部件自动启动。当所有客户释放使用的对象时,部件应立即关闭。

其原因是部件所提供的对象成为使用这些对象的客户应用程序的一部分。客户只要使用了一个部件的对象,就必须能够确保正在使用的对象存在,直到使用该对象的任务完成为止。

同样,如果客户释放了所有对部件所提供的对象的引用,则部件应关闭并释放它所使用的内存和资源。

因此,设计一个性能良好的部件,最重要的两点是:

Visual Basic 在下面的基本指南中提供了大量帮助。本主题将解释具体做法。

不要强制部件关闭

这意味着只要客户应用程序仍在引用部件对象,就永远也不要使用 End 语句来关闭该部件。

这一点对进程内部件来说很容易做到,因为 Visual Basic 禁止在 ActiveX DLL 和 ActiveX 控件工程中使用 End 语句。如果在代码中使用了 End 语句,则编译该部件时将会出错。

注意 Visual Basic 不允许进程内部件中有 End 语句,是因为执行此语句也可能会终止客户应用程序。

进程外部件

如果用 End 语句关闭进程外部件,客户应用程序仍保持着对这个已不存在的对象的引用。当它们试图调用这些对象的属性或方法时,则会引起错误。

此外,部件还可能因其对象收不到 Terminate 事件而不能正确关闭。这是因为 End 语句突然终止部件的执行,并释放对象及内存。而不再执行进一步的 Visual Basic 代码,包括在窗体的 QueryUnload 事件和 Unload 事件中的代码,以及在窗体和类的 Terminate 事件中的代码。

如果按照“Visual Basic 部件关闭规则”中所述 Visual Basic 使用的的四条规则确定何时关闭部件,则永远也不需要强制部件关闭。

不要强制部件保持加载

Visual Basic 将根据“Visual Basic 部件关闭规则”所列举的关闭规则自动下载部件。通过对这些规则的讨论将会明白,当客户应用程序释放对部件对象的引用后,仍有可能保持该部件的加载。

一般来说,这是一个糟糕的主意。尽管部件已不再提供对象,它却仍继续占用内存。事实上,一个拒绝关闭的进程外部件可能在所有客户应用程序终止后仍很长时间占用内存。

注意 不能强制一个进程内部件在其客户应用程序终止后仍保持加载。当客户应用程序关闭时,部件都将被下载,不管有多重要的对象引用或者打开的窗体等等。其中包括此客户应用程序获取后又传递给其他客户进程的引用。

保持部件加载的原因

任何规则总有例外。有两个重要的情况可能需要将部件故意保存在内存中: