2011-11-28 3 views
0

가능한 한 짧고 감미롭도록하려고합니다.TAPI 및 Windows 서비스를 사용하는 액세스 위반 예외

저는 회사에서 매일 약 2000 개의 다른 전화 번호로 전화를 걸기 위해 응용 프로그램을 만들었습니다. (우리가 미국 전역에 배포 한 아주 오래된 장치에 연락하는 데 사용되었습니다.) 응용 프로그램을 Windows 응용 프로그램으로 실행할 때 C# 및 JulMar ITAPI3 래퍼 사용) 응용 프로그램은 최소한 내 코드가 대부분 옳다는 것을 알려주는 아무런 문제없이 단단한 것처럼 보입니다 ....

Windows와 동일한 코드를 실행할 때 발생하는 문제는 서비스 (새 프로젝트 만들기 및 Windows 응용 프로그램처럼 전화 걸기 라이브러리로 전화하기 만하면됩니다.) 서비스는 일정 기간 (매번 변경됨) 실행되고 마침내 중단됩니다. 이벤트 로그를보고 응용 프로그램에서 AccessViolation (0xc0000005)인지 확인합니다. 나는 예외가 일어나고있는 캐치가 결코 치지 않는 tapi wrapper에 대한 나의 호출 주위에 잡는 시도를 가지고있다, 나는 그것이 그 시점으로 돌아갈 수 있기 전에 그것이 단지 응용 프로그램을 추측한다고 가정하고있다.

간단히 말해 Tapi 응용 프로그램은 Windows 응용 프로그램으로 실행될 때 훌륭하지만 Windows 시스템으로 실행될 때 (로컬 시스템에서 실행 중일 때) "위반"기능에 대한 try catch에 의해 잡히지 않은 AccessViolation 오류로 인해 실패합니다 요구.

의견이 있으십니까?

Windows Server 2008에서 실행되고 있습니다.

EDIT 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에 대한 라이센스 비용을 지불 할 것을 확신했으며, 이제는 정상적으로 작동하고있다 ....

모두에게 감사드립니다.

+0

C++ 클래스의 소멸자에서 발생하는 액세스 위반은 힙 손상으로 인해 발생합니다. 관리되는 스택 추적에서 소멸자를 전혀 볼 수 없다는 것이 특히 이상합니다. –

+0

내가 사용하고있는 래퍼의 소스 코드를 볼 수있는 이유가 있습니다. 또한 내 로그 파일에없는 이벤트 로그에 TAddress.CreateCall 주위의 try try catch 문이 실제로 적중되지 않기 때문에주의하십시오. – Chris

+0

레코드 용으로 TraySoft AddTapi와 매우 유사한 JulMar ATAPI를 사용할 수있었습니다. ATAPI를 사용하여 WCF를 사용하는 Windows 서비스로 성공적으로 실행하고 있습니다. – peterincumbria

답변

0

TAPI 응용 프로그램을 서비스로 실행하면 TAPI에서 사용자 별 전화 설정 (전화 걸기 규칙 등)을 사용하기 때문에 항상 LocalSystem 대신 특정 사용자로 실행됩니다.

TAPI가 이러한 설정 중 하나에 액세스하려고 시도했지만 LocalSystem의 사용자 프로필이 구성되지 않았기 때문에 TAPI가 액세스 할 수없는 것일 수 있습니다.

+0

고마워요. 그걸 보게 되겠네요. 제가 생각하기에, 그 항목들 (위치 등)에 대한 참조를 코드에서 빼내고 그 이유 때문에 설정 파일에 넣었을 지 모르지만 어쩌면 무언가 일어나고있는 것입니다. 봐. – Chris

+0

그걸로 운이 없습니다.나는 (몇 번 일한) 나 자신으로 서비스를 실행했고, 관리자 특권을 가진 로컬 컴퓨터 계정과, 상자에 로컬 관리자 권한을 가진 특별히 생성 된 도메인 사용자 계정을 운영했다. 세 사람 모두 액세스 위반 오류가 발생합니다. – Chris