みなさん、こんにちは。
私はVCの初心者です。
[コントロールパネル]の[プリンタ]に表示されている
プリンタの名称を取得し、一覧表示するような処理を
行いたく、「EnumPrinters」関数を使用しているので
すが、以下の点で困っています。
・ローカルプリンタ名称は一覧表示できているが、
ネットワークプリンタ名称は表示されていない。
私が記述した「EnumPrinters」関数は以下のものです。
DWORD dwNeeded;
DWord dwReturned;
EnumPrinters(PRINTER_ENUM_CONNECTION|PRINTER_ENUM_LOCAL,
NULL,4,(LPBYTE)pPrintInfo4,&dwNeeded,
&dwNeeded,&dwReturned);
これで取得した「dwNeeded」変数を、if文で真偽判定し、
EnumPrinters関数が成功したかどうか判定しているので
すが、どうやら失敗しているようです。(これはネットワ
ークプリンタだけをプリンタとして設定している場合で、
ローカルがあれば成功します。)
「PRINTER_ENUM_CONNECTION」の指定をしているので、ネ
ットワークプリンタも取得できると思っていたのですが…。
もし何かお気づきの点があるかた、ご連絡いただきたく
お願いします。
OSは何でしょう?
情報レベル4になっているところからするとNT系でしょうか?
気になる点を一つ、
第1引数を PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK 、
第3引数を 1
としてみてはどうでしょうか
重さん、お返事ありがとうございます。
OSは、「Windows 2000 Server」です。
>気になる点を一つ、
>第1引数を PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK 、
>第3引数を 1
>としてみてはどうでしょうか
関数を、以下のように記述してみたのですが、結果は同じでした。
EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_NETWORK,
NULL,1,,(LPBYTE)pPrintInfo4,&dwNeeded,
&dwNeeded,&dwReturned);
2000 Serverでは「EnumPrinters関数」は対応していないのでしょうか?
(レベル4でコンパイルエラーが出なかったので、
基本はNTと同じなのかな、と思ったのですが…。)
> 2000 Serverでは「EnumPrinters関数」は対応していないのでしょうか?
そんなことはないと思います。
MSDNライブラリを見てみたところ、
Levelパラメータ(第3引数)に1を指定したときに
PRINTER_ENUM_CONNECTIONS で、接続されているすべてのリモートプリンタ。(Nameパラメータは無視)
などと例が載っていました。
もう一度、MSDNライブラリを頼ってみてはいかがでしょう。
お返事ありがとうございます、重さん。
>MSDNライブラリを見てみたところ、
>Levelパラメータ(第3引数)に1を指定したときに
>PRINTER_ENUM_CONNECTIONS で、接続されているすべてのリモートプリンタ。(Nameパラメータは無視)
今、[コントロールパネル]→[プリンタ]の、ネットワークプリンタのプロパティを見ると、
プロパティダイアログのタイトルバーに「XXXXX(?????上)」(XXXXXはプリンタ名)
とありました。もしかして、?????は別のPCで、そこに接続されてるプリンタを
「間接的に」参照しているのかな?(印刷はちゃんとできます。)
と感じました。
ポートの設定も別のIPアドレスのところ固定で変更できないです。
だから、プリンタの設定に問題があるのかな?と考えています。
そういった観点でもう少し調べてみます。
(今日は終電が迫ってきたので、ちょっと帰ります。
重さん、いろいろありがとうございます。(^^;) )
こんばんは、朝美です。
今まで書いていなかくて、ホントに申し訳ないのですが、
「EnumPrinters」関数を使用しているのは、「DLL」です。
ちなみに、ダイアログベースのアプリを新規に作って、
「OK」ボタンクリックイベント内で、同様の処理を書くと、
ネットワークプリンタの名称をちゃんととってきていました。
(つまり、関数の記述・プリンタ設定には、間違いはないようです)
DLLの関数内に記述して、それを呼び出そうとしたときだけ、
ネットワークプリンタ名が取れない(としか考えられないような…)
ような状況です。
「DLLではこうしなさい」というようなことって、あるのでしょうか…?
> 「DLLではこうしなさい」というようなことって、あるのでしょうか…?
色々と有りますが、この場合はどうでしょう?
ローカルがOKでネットワークは駄目となると一度疑ってみる必要があるかもしれません。
申し訳有りませんが、DLLの中身が解らないので何とも言えません・・・。
私の手元にはNTの開発環境がないので、机上で感じたことを述べますと...
(1) EnumPrintersの5番目の引数に&を付けるのはまずいと思います。
(2) EnumPrintersが成功したかどうかの判定は、戻り値(BOOL)で見るべきではないでしょうか。
(3) いきなり情報を列挙する前に、下記の要領でまず必要な領域のサイズを調べた方がよいのではないでしょうか。
DWORD dwNeeded;
DWORD dwReturned;
BOOL bRet;
bRet = EnumPrinters(
PRINTER_ENUM_LOCAL|PRINTER_ENUM_NETWORK,
NULL,
1,
NULL, // 情報配列は指定しない
0, // 領域サイズはゼロ
&dwNeeded, // 必要な領域がバイト数ではいる
&dwReturned
);
LPPRINTER_INFO_1 pPrtInfo1 = (LPPRINTER_INFO_1)LocalAlloc(LPTR, dwNeeded);
bRet = EnumPrinters(PRINTER_ENUM_LOCAL,
NULL,
1,
(LPBYTE)pPrtInfo1, // プリンタ情報が配列として入る
dwNeeded, // &はつけないでね
&dwNeeded,
&dwReturn // 取得したプリンタ情報の個数が入る
);