调试进程外部件

本主题介绍由进程外部件提供的大多数对象的调试过程。但 ActiveX 文档不能用这里介绍的方法调试。请参阅“建立 ActiveX 文档”。

要调试进程外部件,请按照以下步骤执行:

  1. 在类模块代码中设置所需的断点和监视表达式。

  2. 按 CTRL+F5 键或单击“运行”菜单上的“全编译执行”运行部件工程。

    部件会被编译,但在响应客户端请求创建第一个对象之前不运行 Sub Main。

  3. 启动 Visual Basic 的第二个实例,打开测试工程。按设置所需断点和监视表达式。

  4. 运行测试工程。当遇到部件工程代码中的断点时,焦点会转到部件工程上。

    注意 当进程外部件进入中断模式时,焦点可能不会立即切换到部件工程。如果单击了客户端的任何地方,将显示“部件忙”对话框。单击“切换到”按钮把焦点转到部件工程。

  5. 结束调试任务后,在终止部件之前应该先关闭测试工程。

    重点 如果在关闭测试工程之前终止了部件工程,部件提供的所有对象都将被破坏。这样,试图关闭测试程序时可能会产生错误。

启动全编译

通常总是按下 CTRL+F5 或在运行菜单上单击启动全编译来启动过程外部件工程,所以,在部件开始向测试应用程序提供对象之前就解决了所有编译错误。

Visual Basic 中缺省请求时编译代码。这意味着部件中可能有代码直到客户机调用它时还未编译。有些编译错误,不返回设计模式就无法修改,这意味着要关闭部件。这时,测试程序保持无效对象引用。

注意 为使请求编译无效,请在工具菜单中选定选项,选定选项对话框的通用选项卡,并清除请求时编译。这将影响当前会话以及 Visual Basic 今后的实例。

编辑测试工程

开发部件时,可能经常要在调试过程中添加新功能。编辑测试工程时,添加代码检验新特性之前,应保证部件工程处于运行模式。

如果部件工程不在运行模式中,测试工程就无法访问它的类型库。如果使用“工程兼容”,测试工程将使用已编译的可执行文件的类型库。如果可执行文件已生成了一段时间,那么,类型库中不包含已添加的特性的信息。

如果使用的是“版本兼容”的“不兼容”选项,则没有类型库的信息。

编辑测试工程时,部件工程应该始终处于运行模式。

关闭进程外部件

如果调试的对象有 Terminate 事件代码,那么,如果使用工具栏上的“结束”按钮、或者选择“运行”菜单上的“结束”或“重新启动”终止部件工程,Terminate 事件不会被执行。

关闭测试工程将释放部件提供给测试工程的所有对象。这些对象关闭后,它们将释放所有对部件内私有对象的引用。

这样做可使部件符合关闭部件的四条规则,“部件设计的一般准则”的“启动和结束部件”中列出了这些规则。

不幸的是,即使测试工程释放了所有的对象,同时四条关闭条件都满足,进程外部件仍旧无法回到设计模式。要返回设计模式,只能使用“结束”按钮。

如果部件维持对象的内部引用,那么可以创建一个 Sub 过程释放所有这样的引用,通过这种方式来模拟通常的关闭。可以在终止部件之前从“立即”窗口调用该过程— 或者在 Sub 中放一条 End 语句。但是,不能保证私有对象的结束次序与实际关闭相同。

精确测试关闭动作的唯一办法是使用已编译的部件。

提示 由于调试引起的人为的焦点变化,可能会使代码的工作与期望的不同。调试对聚焦或激活动作敏感的情形时,比如鼠标和击键事件,使用 Debug.Print 来记录调试信息。

把部件作为独立的桌面应用程序进行调试

如果进程外部件可以作为独立的桌面应用程序,比如 Microsoft Excel,那么,要测试两种启动和关闭模式。

这种应用程序一般有如下代码,使它们在启动时显示或不显示主窗口:

Sub Main
   If App.StartMode = vbSModeAutomation Then
      '...以不可见方式启动的代码 ...
   Else      '(App.StartMode = vbSModeStandalone)
      '...显示主窗体的代码 ...
   End If
End Sub

StartMode 是 App 对象的只读属性,在运行时使用,以决定应用程序是响应客户应用程序的请求而启动,还是由用户通过任务栏的“启动”按钮启动。

注意 不要把 Sub Main 放在类模块中。把 Sub Main 放在类模块中会把它变成名为 Main 的方法而不再是启动过程。Sub Main 过程必须在标准模块中。

在“工程属性”对话框的“部件”选项卡中,有一个“启动模式”框,调试时,可以通过其设置来控制部件的启动模式。使用“独立方式”设置启动部件同用户通过任务栏的“启动”按钮打开部件一样,使用“ActiveX 部件”设置编译部件,Sub Main 就会在客户端(测试工程)第一次创建对象时运行。

多客户端调试

如果需要调试的问题只在多个客户应用程序使用部件的对象时才发生,那么启动 Visual Basic 的另一个实例,或者编译测试工程并运行 .Exe 文件来提供另一个实例。可以根据需要运行任意多个客户应用程序。

部件无论是被另一个 Visual Basic 工程调用还是被用其它语言编写的客户应用程序调用,都可以调试。例如,如果为 Microsoft Excel 用户特别设计了一个部件,那么在调试时就可以使用 Microsoft Excel 作为客户应用程序。

详细信息 “在部件的错误点上使用中断”解释如何在部件工程使用“错误捕获”选项。有关测试和调试的主题的列表请参阅“测试和调试 ActiveX 部件”。