2013-04-05 2 views
7

C# .NET으로 작성된 Windows 서비스 응용 프로그램이 있습니다. 이 응용 프로그램은 PDF를 생성하는 로컬 소프트웨어 프린터로 문서를 인쇄하여 보고서 pdf를 생성하는 데 사용됩니다. 이것은 Windows XP 및 Windows 7에서 잘 작동합니다. 불행히도 Windows 8에서는 실패하는 것으로 나타났습니다. 그런 다음 Windows 8에서 임의의 (심지어 물리적 인) 프린터로 인쇄 할 때 서비스에서 인쇄 할 때 오류가 있음을 알았습니다. 내 프로그램에 실종 된 것은 무엇입니까?Windows 8에서 Windows 서비스에서 인쇄가 실패합니다.

FlowDocument document = MyDocument; 
var source = document as IDocumentPaginatorSource; 
var documentPaginator = source.DocumentPaginator; 

using (var printServer = new LocalPrintServer()) 
{ 
    PrintQueue queue = printServer.GetPrintQueue(printerName); 
    XpsDocumentWriter docWriter = PrintQueue.CreateXpsDocumentWriter(queue); 

    // Print ticket - Approach 1 
    // PrintTicket printTicket = queue.DefaultPrintTicket.Clone(); 

    // Print ticket - Approach 2 
    var printTicket = new PrintTicket 
    { 
     PageOrientation = PageOrientation.Landscape, 
     PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4), // set size of media (paper) 
    }; 


    documentPaginator.PageSize = new Size(document.PageWidth, document.PageHeight); 
    docWriter.Write(documentPaginator, printTicket); 
} 

서비스 '가 데스크톱과 상호 작용'없이 '시스템 계정'으로 설정됩니다 (하지만 난 너무 또는 로컬 사용자로 로그인하는 것을 시도) :이 방법을 인쇄하고 있습니다.

'인쇄 티켓 - 접근 한'사용하는 경우이 윈도우 8에 예외로 결과

:

System.Printing.PrintQueueException: PrintTicket provider failed to bind to printer. Win32 error: -2147467231 
at MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion) 
at MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion) 
at System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion) 
at System.Printing.PrintQueue.get_DefaultPrintTicket() 

가 '인쇄 티켓을 - 접근법 2'를 사용 : 그 서비스를 말할 것

Exception encountered: System.Printing.PrintQueueException: Fehler beim Binden des PrintTicket-Anbieters an den Drucker. Win32-Fehler: -2147467231 
bei MS.Internal.Printing.Configuration.PTProvider..ctor(String deviceName, Int32 maxVersion, Int32 clientVersion) 
bei MS.Internal.Printing.Configuration.PTProviderBase.Create(String deviceName, Int32 maxVersion, Int32 clientVersion) 
bei System.Printing.PrintTicketManager..ctor(String deviceName, Int32 clientPrintSchemaVersion) 
bei System.Printing.PrintQueue.get_UserPrintTicket() 
bei System.Printing.PrintQueue.get_CurrentJobSettings() 
bei System.Printing.PrintQueue.CreateSerializationManager(Boolean isBatchMode, Boolean mustSetJobIdentifier) 
bei System.Windows.Xps.XpsDocumentWriter.BeginWrite(Boolean batchMode, Boolean asyncMode, Boolean setPrintTicketHandler, PrintTicket printTicket, PrintTicketLevel printTicketLevel, Boolean printJobIdentifierSet) 
bei System.Windows.Xps.XpsDocumentWriter.Write(DocumentPaginator documentPaginator, PrintTicket printTicket) 

을 존재하지 않는 프린터로 인쇄하려고했을 때 "잘못된 프린터 이름"예외가 발생했기 때문에 해당 프린터를 찾을 수 있습니다. 여기

나는 몇 가지 관련 질문에 자신을 위해 노력하겠습니다 : Printing from a Windows Service, Printing from a Windows Service, http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/b74bd27d-1cc8-4fca-a6de-2cd1371cf3b7/, 온화 관련

: Printing from a .NET Service,

편집 : 경우 사람에

가 관심을 시도 중 - 구성 파일에서 선택한 프린터에 간단한 문서를 인쇄하려고하는 샘플 서비스 응용 프로그램이 여기에 있습니다. http://bin.mypage.sk/FILES/PrintTestService.rar

편집 2 :

흥미 롭습니다.

using (var printDocument = new PrintDocument()) 
{ 
    printDocument.PrinterSettings.PrinterName = printerName; 
    printDocument.Print(); 
} 

불행하게도이 시스템의 형태로 페이지가 매겨진 문서를 만들어 내 코드와 호환되지 않습니다 System.Drawing.Graphics 라이브러리를 사용하여 이전의 GDI + 코드 : 나는 다른 인쇄 코드를 시도 할 때 오류가 없다. Windows.Media.Visual 개체. 따라서 문서의 페이지 매김을 처음부터 새로 만드는 데 2 ​​주를 소비하고 싶지 않으면 내 문서를 인쇄 할 수 없습니다.

EDIT3 :

여기에이 문제에 대한 논의가

: 그것은 'anycpu를'플랫폼을 사용하는 http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/96e7fc10-3f08-4808-b748-692e30377293 은 '해결 방법'이있다가. 이 해결 방법은 실제로 작동하지만 (필자가 시도했지만) 서비스가 x86 일 필요가있을 때 사용할 수 없습니다. 나는 실제 솔루션을 찾기 위해 우리 회사를 통해 MS 지원에 연락했습니다.

+1

시스템에서 대화 형 서비스를 사용하도록 데스크톱 PLUS와 상호 작용하도록 서비스를 구성해야합니다. 여기를 참고하십시오 http://msdn.microsoft.com/en-us/library/windows/desktop/ms683502.aspx 참고 Windows 8에서 NoInteractiveServices 레지스트리 키의 값은 기본적으로 1이며 0으로 설정해야합니다. –

+0

@ SimonMourier : 레지스트리 플래그를 0으로 수정 한 다음 재부팅하고 서비스에서 '서비스가 데스크톱과 상호 작용하도록 허용'을 선택했는지 확인했습니다. 결과는 동일합니다. – MiroJanosik

답변

2

해결 방법 : Microsoft에서이 버그를 해결할 때까지 기다리는 중입니다. 버그 (REG : 113040910349062)를보고했으나 확인했지만 다음 달에 곧 수정 될 예정이며 날짜가 지정되지 않았습니다.우리가 사용하는

해결 방법 : , 인쇄를 처리하는 작은 응용 프로그램을 만듭니다 'anycpu를'응용 프로그램으로 컴파일하고 (나는 'anycpu를'로 컴파일 할 수있는 서비스 응용 프로그램에서 실행 - 나는 '86'때문에 필요 의존성의). 이 대안은 테스트를 거쳐 작동합니다. 그러나 그것은 더러운 + 오버 헤드 + 여분의주의를 초래합니다.

편집 : http://support.microsoft.com/kb/2872151/EN-US ("당신은 윈도우 8 또는 Windows Server 2012 x64 기반 버전에서 32 비트 WPF 응용 프로그램에서 인쇄 할 수 없습니다")

: 마이크로 소프트는 윈도우 8에서이 문제를 해결해야 핫픽스를 제공합니다

편집 (2013-11-04) : 우리는 핫픽스를 테스트했으며 Windows 8 또는 Windows 8.1에서는 작동하지 않습니다. 현재 Microsoft와 다시 통신하는 단계에 있습니다.

편집 (2014- 올해 초) : Microsoft에서이 버그를 해결하는 방법을 모르고 버그가 닫혀 있다는 응답을 받았습니다. 그래서 현재로서는 x86 솔루션에 의해 호출되는 AnyCPU로 컴파일 된 작은 응용 프로그램 exe가 필요합니다. 이 접근법은 효과가 있지만 둔화를 야기하며 제품 덕분에 유지 관리가 어려워집니다.

+0

내 대답에서 레지스트리 변경을 테스트 했습니까? 이 컴퓨터는 여러 대의 컴퓨터에서 작동합니다. – NineBerry

+0

안녕하세요, 지금까지 테스트하지 않았습니다. 나는 몇 주 또는 몇 달 후에 그것을 시도 할 것이다. 불행하게도이 작업의 우선 순위는 이제 낮아졌고 프로젝트에 우선 순위를 설정할 수 없습니다. – MiroJanosik

-1

Windows 서비스에서 인쇄하는 것과 동일한 경험을했지만 Windows Server 2008에서 문제가 발생했습니다. Windows 서비스는이 기능을 갖추지 않았기 때문입니다. 나는 블로그 등을 많이 읽었고 솔루션을 찾지 못했습니다. 나는 마침내 서비스가 다른 작업을 호출하여 Microsoft 작업 라이브러리를 사용하여 인쇄하는 방법을 발견했습니다.

+0

이 방법으로 서비스를 인쇄하는 것은 Windows 7에서 작동하며 Windows XP에서 작동합니다. 사용자 상호 작용 (프린터 또는 기타 선택)이 작동하지 않는 이유는 무엇이든 원하지 않습니다. 또한 나중에 두 번째 편집에서 게시했듯이 - 레거시 GDI + 방식을 사용하면 여전히 인쇄 할 수 있습니다 (그러나 충분하지는 않음). – MiroJanosik

+1

나는 당신의 제안을 시도했다 - 나는 인쇄 작업을 수행하는 실행 파일을 만들었다. 실행 파일 자체는 잘 작동하고 필요한 것을 인쇄하지만, 서비스에서 실행 한 후에는 서비스에서 이전과 같은 예외가 발생합니다. Process.Start()를 사용하여 실행 파일을 실행하고 있습니다. – MiroJanosik

+0

그 요점은, 당신은 창 방식으로 그런 식으로 프로세스를 호출 할 수 없습니다. Microsoft 작업 라이브러리를 살펴보고 콘솔 응용 프로그램을 실행하는 Windows 작업을 설정하는 것이 좋습니다. msdn 및 codeproject에는 많은 설명서가 있습니다. – serdna

2

http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/fdcfa0fa-50aa-4a61-be79-5b4c8f65fbf7/ 우리는 Microsoft에보고하고 윈도우 8에서 버그 및 Windows Server로 확인 된 것을 볼 수 2012 표준이 아닌 사용자 세션에서 32 비트 프로세스 (에서 인쇄 할 때이 버그가 트리거됩니다

예를 들어 서비스처럼).

Microsoft에 따르면이 버그는 Windows 8.1 및 Windows Server 2012 R2에서 해결되었습니다. 그러나 우리는 여전히 Windows 8.1에서이를 재현 할 수 있습니다.

동일한 사이트에서 Microsoft는 대안을 제공합니다. 이 해결 방법은 Windows 8.1의 문제를 해결했습니다. 그것은 아마도 다음과 같이 2012 년

해결 방법은 간다 윈도우 8 및 Windows Server에서 작동 :

  1. 열기 Regedit를 HKEY_CLASSES_ROOT의 \의 CLSID로 이동 {BA7C0D29-81CA-4901-B450-634E20BB8C34}

  2. "AppID"레지스트리 항목의 값을 확인하십시오. 우리의 경우이 있었다 {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}

  3. 지금 HKEY_CLASSES_ROOT \ AppID가 {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0}로 이동 (또는 시스템에있는 각각의 값)
  4. 이 레지스트리 키에서
  5. , 이름이 "AccessPermission", "LaunchPermission"와 "를 RunAs"으로 항목을 삭제이 이후

윈도우에서 문제를, 당신은 당신의 코드에서 문제를 해결할 수 없습니다. 해결 방법은 부작용이있을 수 있지만 시나리오에서는 아직까지 보지 못했습니다.

+0

안녕하세요, 몇 가지 기본 테스트를 수행하고이 해결 방법이 작동합니다. 다른 컴퓨터에서 더 많은 테스트를해야합니다. – MiroJanosik

관련 문제