使用TAPI和Windows服务的AccessViolation异常

时间:2011-11-28 16:07:22

标签: c# windows-services tapi

我会努力尽可能简短而甜蜜。

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

我遇到的问题是我运行与Windows服务相同的代码(创建新项目,只需像Windows应用程序一样调用电话拨号库)该服务将运行一段时间(每次都有所不同) )然后最终会崩溃。我查看事件日志,看到它是应用程序中的AccessViolation(0xc0000005)。我试着抓住我对tapi包装器的调用,异常发生但是捕获永远不会被命中,我假设它只是崩溃应用程序才能恢复到那一点。

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

有什么想法吗?

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

编辑1: 我尝试将此服务作为几种不同类型的用户帐户运行,包括本地用户帐户,域帐户,本地系统。所有这些都错了。我已从事件日志中发布了一个片段,其中包含以下其中一个失败。

      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的许可证,它现在工作得很好....

谢谢大家。

1 个答案:

答案 0 :(得分:0)

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

可能是TAPI正在尝试访问其中一个设置但无法访问,因为尚未配置LocalSystem的用户配置文件。