none
プリントキューの消去 RRS feed

  • 質問

  • C++/CLIでプリントキューを消去するプログラムを作っています。

    ソースは

    // CslSpoolClear.cpp : メイン プロジェクト ファイルです。

    #include "stdafx.h"

    using namespace System;
    using namespace System::Printing;

    int main(array<System::String ^> ^args)
    {
      try {
      //
      //----- プリントキューの消去
      //
      Printing::LocalPrintServer ^LocalPS = gcnew Printing::LocalPrintServer();
      Printing::PrintQueueCollection^ Queues = LocalPS->GetPrintQueues();
      for each( Printing::PrintQueue^ pq in Queues) {
       String^ name = "回復不能なエラー";
       try {
        name = pq->FullName;
        String^ msg = "プリントキュー[" + name + "]";
        Console::WriteLine( msg );
        pq->Purge();
       }
       catch (NullReferenceException^ nullpt) {
        String^ errmsg = "NullReferenceException["+nullpt->Message+"]";
        Console::WriteLine( errmsg );
       }
      }
     }
     catch (NotImplementedException^ notImp) {
      String^ errmsg = "NotImplementedException["+notImp->Message+"]";
      Console::WriteLine( errmsg );
     }
        return 0;
    }

    結果は

    プリントキュー[Microsoft XPS Document Writer]
    NullReferenceException[オブジェクト参照がオブジェクト インスタンスに設定されていません。]
    プリントキュー[Fax]
    NullReferenceException[オブジェクト参照がオブジェクト インスタンスに設定されていません。]

    名前が取れているのに、メソッドを呼び出すと例外エラーになる原因がわかりません。

    2013年9月17日 5:16

回答

  • たぶん、.NET Frameworkのバグだと思います。

    System::Printing周りはC++/CLIで記述されていてそこそこ特殊です。

    • 根気強くバグ報告し、修正してもらうか
    • あきらめてネイティブコードで記述するか

    だと思いますが、たいてい後者を選択しているようで、いろんなバグが残ってます。
    # バグではないと主張されることもありますので、その際はやはりあきらめるしか。

    • 回答としてマーク 星 睦美 2013年10月10日 8:34
    2013年9月24日 2:06

すべての返信

  • kymiyabe さん、投稿ありがとうございます。
    フォーラム オペレーターの星 睦美です。

    今回はコミュニティの回答者からのアドバイスが集まりにくいようですので、
    私のほうでもMSDN ライブラリに役立つ情報がないか調べてみました。

    (参考情報)
    例外のトラブルシューティング : System.NullReferenceException:

    トラブルシューティングに書かれているヒントを参考にプログラムを見直してみてはいかがでしょうか。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2013年9月24日 1:53
  • たぶん、.NET Frameworkのバグだと思います。

    System::Printing周りはC++/CLIで記述されていてそこそこ特殊です。

    • 根気強くバグ報告し、修正してもらうか
    • あきらめてネイティブコードで記述するか

    だと思いますが、たいてい後者を選択しているようで、いろんなバグが残ってます。
    # バグではないと主張されることもありますので、その際はやはりあきらめるしか。

    • 回答としてマーク 星 睦美 2013年10月10日 8:34
    2013年9月24日 2:06
  • 佐祐理さん、返答ありがとうございました。

    結局他の方法で逃げました。

     Management::ManagementObjectSearcher^ searcher = gcnew Management::ManagementObjectSearcher("SELECT * FROM Win32_Printer");
     for each( Management::ManagementObject^ printer in searcher->Get() ) {
      String^ name = printer->ToString();
      if ((name->Contains("\"Fax\"")==true)||(name->Contains("\"Microsoft XPS Document Writer\"")==true))
       continue;
      Management::ManagementBaseObject^ obj = printer->InvokeMethod("CancelAllJobs", nullptr,nullptr);
      System::Object^ r = obj->GetPropertyValue("returnValue");
      if (r->Equals(UInt32(0))==false) {
       Console::WriteLine("CancelAllJobs失敗["+r->ToString()+"]");
      }
     }

    2013年10月2日 1:03
  • フォーラム オペレーターの星 睦美です。
    kymiyabe さん、こんにちは。

    佐祐理 さんの返信が参考になったようですね。私のほうで[回答としてマーク]させていただきました。

    kymiyabe さんの解決方法も参考になると思います。ありがとうございました。

    今後ともMSDN フォーラムをよろしくお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2013年10月10日 8:39