将对象作为参数传递
COM+ 排队组件服务不会为每个现有的 COM 组件启用排队。 可以排队的方法的类型有限制。 由于消息传递的限制,方法必须遵守以下规则:
- 只能包含输入参数。
- 不得返回任何特定于应用程序的结果。
此外,可以传递给排队组件的输入参数的类型也有限制。 在运行时,排队的组件服务在客户端打包参数,并使用消息队列将它们传递给服务器组件。 简单类型(如整数和布尔值)可以很容易地封送;而更复杂的类型在没有帮助的情况下无法封送。
在将对象作为参数通过排队组件的方法调用的情况下,客户端将对象传递给记录器。 记录器将对象封送为消息队列消息,并将其传递给侦听器。 在侦听器接收到消息并将其传递给播放器之后,播放器必须重新实例化对象以将其分派给客户端指定的方法调用。 根据排队环境中客户端和服务器的生存期,这意味着这些对象必须能够按值封送。 由于 COM+ 不为标准 COM 对象提供按值传递语义,因此记录器和播放器需要组件的帮助来封送和拆收对象。
支持 IPersistStream 的对象引用可以用作对排队组件进行方法调用的参数。 对象无法对何时重新实例化进行假设。 例如,服务器可能不可用,或者服务器组件可能要到当天晚些时候才能启动。 不支持 IPersistStream 的对象将返回错误。
Visual Basic 持久性对象
Microsoft Visual Basic 6 允许创建持久性对象。 这些对象支持 IPersistStream,并且可以作为参数传递给排队组件方法调用。 必须先初始化 Visual Basic 对象,然后才能将 Visual Basic 对象传递给排队组件。 可以通过以下两种方式之一完成此操作:
- 如果创建持久性的应用程序是用 Visual Basic 编写的,则 Visual Basic 运行时会自动处理对象初始化。
- 如果创建 Visual Basic 持久性对象的应用程序是用 Visual Basic 以外的语言(如 Microsoft Visual C++)编写的,则应用程序必须通过查询持久性对象的 IPersistStream 接口或调用 IPersistStreamInit::InitNew 或 IPersistStream::Load 方法显式初始化组件。
ADO 记录集和 OLE DB 行集
在组件之间传递 ADO 记录集或 OLE DB 行集对象允许一个组件处理由另一个组件执行的查询结果。 这在跨多台计算机部署应用程序时非常有用。 记录集和行集对象可以作为方法参数传递给排队组件,但有以下限制:
- 不能使用 IPersistStream 封送服务器端记录集对象。 只能将客户端记录集对象作为参数传递给排队组件方法调用。
- 如果直接使用 OLE DB,则必须将 OLE DB 行集定义为客户端行集。