API 呼び出しを介して HTML ページを取得し、SHDocVw.InternetExplorer & ExecWB を使用してドキュメントを印刷する C# コンソール アプリケーションがあります。アプリケーションを直接実行すると (ダブルクリック)、すべてが期待どおりに実行されます。しかし、Windows サービスからアプリケーションを実行すると、コンソール アプリケーションがハングし、プリンターが応答するのを待ちます。
私は管理者としてサービスを実行しており、タスク マネージャーから収集した情報から、コンソール アプリケーションも管理者として実行しています。プリンター名が有効であることのチェックを含め、すべてが合格したため、アプリケーションがプリンターにアクセスできるようです。IE のインスタンスは問題なくドキュメントをロードするため、プリンターに送信するコンテンツがあります。OLECMDEXECOPT_DONTPROMPTUSER を OLECMDEXECOPT_PROMPTUSER に切り替えると、直接実行すると期待どおりの結果が得られますが、サービスを介して実行すると何も得られません。
サービス内:
public void RunProgram(string exePath)
{
Process p = new Process();
p.StartInfo = new ProcessStartInfo(exePath);
p.Start();
p.WaitForExit();
}
印刷機能では:
ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
Thread.Sleep(100);
ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
while (!documentPrinted)
{
PrintToErrorFile("waiting for printing to complete...");
Thread.Sleep(100);
}
直接実行すると、印刷関数は予想どおり「待機中...」の6行程度を出力します。サービスから実行すると、プログラムは期待どおりに実行され (API 呼び出しとすべて)、待機中のメッセージが無限に繰り返されます。