【问题标题】:AccessViolation exception with TAPI and Windows ServiceTAPI 和 Windows 服务的 AccessViolation 异常
【发布时间】:2012-01-10 06:50:14
【问题描述】:

我会尽量让这个简短而甜蜜。

我创建了一个应用程序,我的公司每天使用该应用程序拨打大约 2000 个不同的电话号码(用于联系我们在美国部署的非常旧的设备),当我将应用程序作为 Windows 应用程序运行时(使用编写C# 和 JulMar ITAPI3 包装器)应用程序似乎运行稳定,没有任何问题,这告诉我至少我的代码大部分是正确的......

我遇到的问题是当我运行与 Windows 服务相同的代码时(创建新项目并像 Windows 应用程序一样简单地调用电话拨号库)该服务将运行一段时间(每次都不同) 然后最终会崩溃。我查看事件日志,发现它是应用程序中的 AccessViolation (0xc0000005)。我在调用tapi 包装器时尝试捕获异常,但捕获器从未被击中,我假设它只是在应用程序可以回到那个点之前崩溃。

因此,简而言之,Tapi 应用程序在作为 Windows 应用程序运行时运行良好,但在作为 Windows 服务运行(在本地系统下运行)时最终会失败,并出现 AccessViolation 错误,该错误未被围绕“违规”函数调用的 try catch 捕获.

有什么想法吗?

如果有帮助的话,它正在 Windows Server 2008 上运行。

编辑 1: 我尝试将此服务作为几种不同类型的用户帐户运行,包括本地用户帐户、域帐户、本地系统。他们都出错了。我已从事件日志中针对以下故障之一发布了一个 sn-p。

      Application: EaglePolloutWindowsService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
Stack:
   at <Module>.ATL.CComPtrBase<IUnknown>.{dtor}(ATL.CComPtrBase<IUnknown>*)
   at JulMar.Tapi3.Internal.TapiBase.Compare(IUnknown*)
   at JulMar.Tapi3.TTapi.FindInterface[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](IUnknown*)
   at JulMar.Tapi3.TCall.CreateCallAppearance(JulMar.Tapi3.TAddress, IUnknown*)
   at JulMar.Tapi3.TAddress.CreateCall(System.String, JulMar.Tapi3.LINEADDRESSTYPES, JulMar.Tapi3.TAPIMEDIATYPES)
   at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.CreateNewCall(EaglePhoneLibrary.Entities.ConnectionEntity)
   at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.CallTower(EaglePhoneLibrary.Entities.ConnectionEntity)
   at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.ContinueIteration()
   at EaglePhoneLibrary.Logic.Outgoing.EaglePollout.ContinuePollout(EaglePhoneLibrary.Entities.ConnectionEntity)
   at EaglePhoneLibrary.Logic.Outgoing.EaglePollout+<>c__DisplayClass52.<CallTower>b__4e(System.Threading.Tasks.Task)
   at System.Threading.Tasks.Task+<>c__DisplayClassb.<ContinueWith>b__a(System.Object)
   at System.Threading.Tasks.Task.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
   at System.Threading.Tasks.Task.ExecutionContextCallback(System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
   at System.Threading.Tasks.Task.ExecuteEntry(Boolean)
   at System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

感谢大家迄今为止和未来的帮助。

编辑 2:我已放弃尝试解决此问题。我最好的猜测是,它源于 JulMar 如何处理包装器中创建的一些 COM 对象的问题。我说服我的公司为 TraySoft AddTapi .NET 支付许可证,现在它工作得很好......

谢谢大家。

【问题讨论】:

  • C++ 类的析构函数中引发的访问冲突是由堆损坏引起的。奇怪的是,您可以在托管堆栈跟踪中看到析构函数。
  • 我有我正在使用的包装器的源代码,这可能就是我能看到它的原因。另请注意,这是在事件日志中而不是在我的日志文件中,因为我在 TAddress.CreateCall 周围的 try catch 语句实际上从未被命中。
  • 只是为了记录,您可以使用看起来与 TraySoft AddTapi 非常相似的 JulMar ATAPI。我正在使用 ATAPI 非常成功地作为 Windows 服务与 WCF 一起运行。

标签: c# windows-services tapi


【解决方案1】:

当我们将 TAPI 应用程序作为服务运行时,由于 TAPI 使用特定于用户的电话设置(拨号规则等),我们总是让它们作为特定用户而不是 LocalSystem 运行。

可能是 TAPI 正在尝试访问这些设置之一,但由于尚未配置 LocalSystem 的用户配置文件而无法访问。

【讨论】:

  • 谢谢,我会看的,我知道我把对这些项目(位置等)的大部分引用(考虑了所有)从代码中提取到了配置文件中,但也许有些东西是发生在我看不到的幕后。
  • 不走运。我已经以自己的身份运行该服务(运行了几次),一个具有管理员权限的本地计算机帐户,以及一个专门创建的具有本地管理员权限的域用户帐户。这三个都收到 AccessViolation 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2012-06-14
  • 2011-08-27
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
相关资源
最近更新 更多