none
ポートの追加 RRS feed

  • 質問

  • いつもお世話になっております。

    Windows7、VS2008 C++で開発しています。

    自社製のプリンタ用のポートを追加したいのですが、

    OpenPrinter()で得たHANDLEを使って、XcvData()をCALLすればできると聞きました。

    http://jitta.wankuma.com/PrintSpooler/portMonitor/adding_a_port.htm

    このサイトにもそのようなことが書かれています。

    今のところ、OpenPrinter()でエラーが返ってきます。(1801=”プリンタ名が無効です”)

    引数をどのようにセットすればよいのでしょうか?

    ご指導のほど、よろしくお願いいたします。

    下記はうまくいっていないソースの抜粋です。

    ----------------------------------------------------------------

     HANDLE hXcv = INVALID_HANDLE_VALUE;
     PRINTER_DEFAULTS Defaults = { NULL, NULL, SERVER_ACCESS_ADMINISTER  };

     TCHAR lpXcvName[64];

     *lpXcvName = TEXT('\0');

     wcscat(lpXcvName,TEXT(","));
     wcscat(lpXcvName,TEXT("XcvPort"));
     wcscat(lpXcvName,TEXT(" "));

    OpenPrinter(lpXcvName, &hXcv, &Defaults );

    ----------------------------------------------------------------

    2012年12月10日 6:33

回答

  • プリンター名がその記述で正しいかわかりませんが、100%失敗するのでしょうか? OpenPrinterにはコミュニティコメントとして失敗しやすい旨が書かれています。不安定なAPIなのだと思います。
    • 回答としてマーク kizakura_ui 2012年12月10日 23:48
    2012年12月10日 10:20
  •  え~っと、このページだけを読まれたのでしょうか?全体的な流れの中で、このドキュメントがどの様な位置にあるのか理解していないと、ちょっと難しいかと思います。例えば、「2.プリントスプーラの XcvData 関数を、数回呼び出します。」と書いてありますが、「数回って、何回だよ?!」とか、思われませんでした?また、今回は OpenPrinter がエラーを返すということですが、OpenPrinter function は、読まれました?

     それで、ここに書いてあるコードだと、",XcvPort " で開きにいきます。これは、「ポートで指定するけど、ポートの名前は""だよ」ということです。そういう名前の(つまり無名の)ポートはありますか?

     なお、ポートを作成するのだから、「このモニターのこういう名前のポートを作成する」になります。OpenPrinter に対しては、「ポートモニター名」を指定して下さい(",XcvMonitor MONITOR_NAME")。


    Jitta@わんくま同盟

    • 回答としてマーク kizakura_ui 2012年12月10日 23:48
    2012年12月10日 13:24

すべての返信

  • プリンター名がその記述で正しいかわかりませんが、100%失敗するのでしょうか? OpenPrinterにはコミュニティコメントとして失敗しやすい旨が書かれています。不安定なAPIなのだと思います。
    • 回答としてマーク kizakura_ui 2012年12月10日 23:48
    2012年12月10日 10:20
  •  え~っと、このページだけを読まれたのでしょうか?全体的な流れの中で、このドキュメントがどの様な位置にあるのか理解していないと、ちょっと難しいかと思います。例えば、「2.プリントスプーラの XcvData 関数を、数回呼び出します。」と書いてありますが、「数回って、何回だよ?!」とか、思われませんでした?また、今回は OpenPrinter がエラーを返すということですが、OpenPrinter function は、読まれました?

     それで、ここに書いてあるコードだと、",XcvPort " で開きにいきます。これは、「ポートで指定するけど、ポートの名前は""だよ」ということです。そういう名前の(つまり無名の)ポートはありますか?

     なお、ポートを作成するのだから、「このモニターのこういう名前のポートを作成する」になります。OpenPrinter に対しては、「ポートモニター名」を指定して下さい(",XcvMonitor MONITOR_NAME")。


    Jitta@わんくま同盟

    • 回答としてマーク kizakura_ui 2012年12月10日 23:48
    2012年12月10日 13:24
  • ありがとうございます。

    今のところ、100%失敗しています。

    引き続き、いろいろ試してみたいと思います。

    2012年12月10日 23:48
  • モニター名をセットしたり、いろいろ試してみたのですが、うまくいかず質問させていただきました。

    もう少し勉強してみます。

    ありがとうございました。

    2012年12月10日 23:55
  •  その訳文を書いた頃、ポートモニターやポートモニターをインストールするプログラムを作っていましたが、OpenPrinter が失敗したことは一度もありませんでした。昔のコードを引っ張りだして検索してみましたが、ジョブの監視など、結構通るところに使っているので、失敗しやすい API ならば気になっていると思います。しかし、そんな記憶はありません。これは、引き継いだ前の担当者からも何も申し送りをされていないことを含みます。(とりあえず、次の担当者へ申し送りした内容を調べてみた)
     ただ、第一引数に指定する文字列を、スペースの配置や大文字小文字に気を遣って指定したように思います。cat せずに単一の文字列として与えた場合、どうなるでしょうか。


    Jitta@わんくま同盟

    2012年12月11日 14:29
  • Jittaさんの話はどのOSでの記憶でしょうか。 先のコメントに私自身の経験は含めませんでしたが、Windows 7とか最近のOSで変なエラーが返ってきやすい印象です。

    とはいえ100%失敗するのならエラーメッセージからもわかるように lpPrinterName が間違っているんでしょうね。
    #  と思って最初に「プリンター名がその記述で正しいかわかりませんが」と書きました。

    2012年12月11日 22:35
  • Jittaさんの話はどのOSでの記憶でしょうか。 先のコメントに私自身の経験は含めませんでしたが、Windows 7とか最近のOSで変なエラーが返ってきやすい印象です。

     Windows Vista までです。引き継ぎ先の資料を確認してみましたが、Windows 7, Windows 8 とも、記録はありませんでした。
     実は引き取ることになっているので、口頭ででも確認してみます。情報ありがとうございます。


    Jitta@わんくま同盟

    2012年12月14日 13:49