2

System.Drawing.Printing名前空間を使用してドキュメントを印刷するコードがあります。これをWindowsサービスに移動する必要があります。ドキュメントには、これは不可能であると記載されています。これは、これまでの私の調査結果をサポートします(機能しないという点で)。System.Printing代わりに名前空間を使用することでこれを機能させることができるという前提で作業しています。

これが私がこれまでに持っているコードです:

private Metafile myDoc;

myDoc = GetEmfDoc();

PrintServer ps = new PrintServer("\\server1\printer1");
EnumeratedPrintQueueTypes[] flags = { EnumeratedPrintQueueTypes.Local };
PrintQueueCollection queues = ps.GetPrintQueues(flags);

PrintQueue pq = queues.First<PrintQueue>();                
pq.AddJob("JobName", ?);

に渡したいmyDocのですpq.AddJob()が、出来ないようです。これを使用System.Drawing.Printingすると、イベントでページごとにこれを簡単にレンダリングすることができましたPrintDocument.PrintPage

私がやろうとしていることは可能ですか?もしそうなら、誰かが私を正しい方向に向けることができますか?

4

3 に答える 3

3

System.Drawing.Printing名前空間内のクラスは、WindowsサービスまたはASP.NETアプリケーションまたはサービス内での使用はサポートされていません。これらのアプリケーションタイプのいずれかからこれらのクラスを使用しようとすると、サービスパフォーマンスの低下や実行時の例外など、予期しない問題が発生する可能性があります。

この文脈で「サポートされていない」とはどういう意味かを理解することが重要です。それは文字通りそれが言うことを意味します、それはあなたがサービスから印刷しようとして問題を発見しようとします、そしてあなたはマイクロソフトサポートに電話して助けを求めることができません。

これは、System.Drawingによって引き起こされる問題ではなく、プリンタドライバの一般的な問題です。Microsoftではなく、プリンタの製造元から提供されたコードのチャンク。それらの重要な問題は、それらが常にデスクトッププログラムから使用されるように設計されていることです。Word、Acrobatなど。彼らはそれをすぐに利用します、彼らはしばしば彼らがそれに取り組んでいることをあなたに知らせるためにウィンドウをポップアップします。少なくともメーカー名をスパムし、トナーカートリッジが半分空であることを思い出させてください。これらのドライバーは、サービスで誤動作する可能性があります。メモに記載されている「ランタイム例外」のフレーズ。

それらの最悪の問題は、問題があることを通知するためにポップアップウィンドウを使用することです。サービスからプリンタードライバーを使用する場合、これらのウィンドウは表示されません。したがって、認識できる理由もなく印刷を拒否する印刷ジョブを処理する必要があります。メモの「サービスパフォーマンスの低下」というフレーズ。これに対処するのは非常に困難です。ITスタッフは、診断が表示されないときに問題を修正することはできません。

あなたのアプローチはその根本的な問題を解決しません。本当にこれを追求したい場合は、プリンタの製造元に連絡して、具体的なアドバイスを求めてください。期待を裏切らないでください。ハードウェア会社から良い答えを得るのはかなり難しいです。

于 2012-04-15T18:00:03.933 に答える
1

これは、権限の問題とセッション0の分離の組み合わせです...

私はお勧めしませんが、以下はあなたが直面する問題を解決するかもしれません:

本当にこの作業を行う必要がある場合は、server1セッション0内(「通常の」ユーザーセッションからではなく)からリモートサーバー(この例では)に(事前に!)ログオンする必要があります-インタラクティブに( )またはいくつかの呼び出しを介してセッション0デスクトップに切り替えrundll32 winsta.dll,WinStationSwitchToServicesSessionます(たとえばWNetAddConnection2、リモートマシンへの適切な資格情報を使用して、残念ながら、これは.NETからp /invokeまたはCOMを使用してのみ使用できますWScript.Network)。このログオンに使用される資格情報には、リモートマシンでの印刷に関する完全なアクセス許可が必要です。

于 2012-04-14T07:46:45.570 に答える
0

プリンターを使用するために必要な権限を持つアカウントでサービスを実行していますか?詳細については、Windowsサービスに関するFAQを参照してください。

于 2012-04-11T13:55:08.837 に答える