2

我是一家非营利组织的 IT 部门。我今天有一个问题可能对这个论坛来说太专业了,我希望我不要浪费时间写出来。我们正在使用 Blackbaud 的“Raiser's Edge”(RE)软件(据我所知是用 VB6 和 VB.net 编写的)来跟踪我们的会员资格和捐款情况。我们有一个 MS Access 应用程序(在我们获得 RE 之前就一直在使用它)来处理捐赠,现在我想保留它,只做一些小的改动以使其适应新软件。

MS Access 程序现在对 RE API 进行了几次调用,效果很好。要登录并建立连接,我必须创建一个新的“REAPI”对象并将其用于其他 API 调用。该REAPI对象有一个名为: 的方法SignOutOnTerminate,在创建该对象时需要将其设置为 TRUE。一旦我的应用程序关闭,它应该会终止与 RE 的所有连接。没有常规的.close方法。

一旦我创建了对象,我就可以根据需要多次工作,而且就我所见,完全没有问题。

但是,当尝试关闭应用程序或将对象设置为空(Set REAPI = Nothing)时,Access 立即崩溃(它淡出,我收到消息说 Windows 正在寻找问题的解决方案。然后 Access 关闭并自行重新启动。)

它比阻碍生产更烦人和不专业,但我想修复它。

该应用程序是在 Windows 7 64 位和 Access 2010 32 位上开发的。它在带有 Office 2003 或 2007 计算机(32 位)的 Windows XP 上进行了测试,并且行为方式相同。

我已经在 2 Blackbaud 论坛上发布了这个问题,并尝试了一个建议的解决方法,但它不起作用(使用 shell 命令终止进程,然后将对象设置为空)。希望我能很快得到更多的答案。

我试图SignOutOnTerminate在创建对象时排除 。但是得到了同样的行为。

我查看了事件管理器 --> 应用程序日志并找到了崩溃。它报告由于此 dll 导致访问崩溃:C:\Windows\System32\MSVBVM60.dll(它实际上位于 SysWos64 文件夹中,因为它是一个 32 位应用程序)。

查找此错误时,我发现了一些建议,可以将其替换为 XP 附带的早期版本的 dll。我找到了一个文件并尝试了该建议,但它仍然崩溃了。错误日志将旧版本号报告为错误,因此我正确注册了它。

我还用 Blackbaud 创建了一个案例,但代表不知道问题出在哪里,也没有安装 MS Access。他正试图让他的支持团队为他安装它,以便他可以测试和调查此错误。

我最后的怀疑是 API 导致了错误,我的代码很好。

但是在我做出这个假设之前,直到我从 Blackbaud 得到我的答案之前,我想做一个最后的检查,但是我已经没有进一步解决问题的想法,所以在这个论坛上提出了这个问题。

有任何想法吗?

4

1 回答 1

7

我意识到这是一个旧线程,如果您现在已经解决了这个问题,那就太好了。然而,这是 The Raiser's Edge API 的一个已知问题。如果您将 .NET 与 RE 的 API(基于 COM)一起使用,那么肯定有一些资源没有被正确清理。有一次,我怀疑这与使用 RE 的图形界面有关,即通过调用常规登录方法将您登录到 RE。但是,即使您使用提供用户名和密码的“作为服务器”方法登录到 RE,它仍然会在退出应用程序时崩溃。

我们有一个在 RE 中设置凭据的安装程序。安装程序位于 .NET 中并访问 RE API。我们现在在应用程序结束之前显示一条消息,告诉用户忽略即将发生的崩溃......无论如何都不是一个很好的解决方案。

于 2014-11-07T16:55:49.237 回答