Crystal 报告 4.6 和臭名昭著的自动化错误 -2147417848 调用的对象已与其客户端断开连接



我正在将DAO应用程序从16位VB3更新为32位VB6(是的,现在是2014年,不要问..(使用 VB6 SP6 + Crystal Reports 软件包,该软件包随 VB6(版本 4.6(提供。

该应用程序具有生成报表的多个窗体。我对生成报告的每个表单都有水晶报告控件。

在我的开发机器中 - 它有所有正确的 CryRpt OCX 和 DLL - 报告有时可以工作,但在这种情况下我收到提到的错误:

  • 打开表单 1 并打印内容

  • 打开表单 2 并打印内容

  • 关闭表格 2

  • 返回到表单 1,当您尝试打印时,您会得到对象已与其客户端断开连接

  • 如果打开窗体 2(或带有"晶体报告"控件的另一个窗体(,则在新窗体打开时,窗体 1 可能会再次开始打印

  • 在所有这些打开和关闭的过程中,整个事情最终会崩溃并显示一条令人讨厌的 Windows 错误消息(包括 VB IDE(。

万事如意,佩德罗

我找到了一个解决方法,我想分享一下,以防其他人遇到这种情况。

看起来,您不能有多个带有Crystal Reports 4.6 OCX的表单。每个应用程序仅使用 1 个 OCX 实例。CR 4.6 似乎不能很好地处理 OCX 的加载和卸载,以及在打开和关闭包含 CR OCX 的多个表单时在幕后共享关联的 DLL。

我发现的解决方法是创建一个带有一个Crystal Reports OCX的表单。此表单始终加载但隐藏;每当我需要呈现报表时,应用程序中的所有表单都会使用/调用它。总之:

  • 板条箱形式"prntHndlr"(或使用您想要的任何名称(并将水晶报告OCX放在上面。

  • 在应用程序启动时加载此表单(但将其隐藏(

  • 您需要在 frmPrntHndlr 中创建 1 个公共方法(例如"MyPrintReport"(来接收参数并打印报告(接收 RPT 文件路径、DB 路径、排序顺序、选择公式等(

每当我需要打印时,我都会调用prntHndlr.MyPrintReport(....(。该函数获取参数,将它们分配给 OCX,最后"显示"报表。

该功能可以根据需要多次调用。

当应用程序关闭时,需要由最后一个表单卸载表单。(其他明智的做法是,它实际上不会关闭并留在进程管理器中(。

像魅力一样工作!

我花了几个小时来追踪这个(谷歌没有帮助(,所以我认为与社区分享这个会很有用。

再一次,如果您知道任何解决方法或更好的方法来解决此问题,请告诉我

万事如意,佩德罗

最新更新