お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"NTでのPrinter.Printersのバグ修正"




 

  NT上でPrinter.Printersを参照すると、95のときとは異なりポート名がついてい
ません。さらに、プリンタ設定ダイアログを実行した後で、再度Printer.Printers
を参照すると、同じプリンタについてポート名無しとポート名有りのものが得られ
ます。これらはVCLのPrintersユニットのバグによるものです。

 Delphi3.1のVCLのソースコードのPrinters.pasを見てください。Printersユニット
の TPrinter.GetPrinter メソッドでプリンタ一覧を取得していますが、NTのとき
(Win32PlatForm = VER_PLATFORM_WIN32_NT)は、ポート名を取得できてません。一応
取得する努力をした後があって、それは「//」でコメントになってます。

 上記はDelphi3.1の場合で、Delphi4では、コメント自体も削除されて、完全に努力を
放棄してしまってます。

 ところが、プリンタ設定ダイアログを呼び出すと、OKボタンが押された場合、
TPrinter.setPrinterを呼び出します。その引数にはポート名が指定されています
(つまり設定ダイアログはポート名がわかっている)。setPrinter側では、自分の持
っているリストの中のどのプリンタが指定されたのかを調べるのですが、ポート名が
違うので一致しません。で、どうするかというと単純に新たなプリンタとして追加し
てしまいます。

 NT4.0であれば、これを修正するのは簡単です。以下のようにします。

    TPrinter.GetPrintersメソッドの中を以下のように書き換え。

      if Win32Platform = VER_PLATFORM_WIN32_NT then
      begin
        Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
        Level := 5;  //<------ 4だったのを5に変更
      end
      else
      begin
        Flags := PRINTER_ENUM_LOCAL;
        Level := 5;
      end;

 プリンタリストを取得するにはEnumPrintersというAPIを呼びますが、NT3.51では
Level5が使えません。NT4.0から使えるようになったらしいです。したがって、上記の
修正はNT4.0であることが判っている場合にだけ通用します。

 ちなみに、VCLもいい加減なら、APIのマニュアルもかなりのものです。

 Delphi3.1のHelpディレクトリにあるWin32.HLPでEnumPrintersをひくと、

>Level
>
>Specifies the type of data structures pointed to by pPrinterEnum. Legal 
>values are 1, 2, 4, and 5, which correspond to the  PRINTER_INFO_1, 
>PRINTER_INFO_2,  PRINTER_INFO_4, and PRINTER_INFO_5 data structures.
>
>Windows 95: This value may be 1, 2, or 5.
>Windows NT: This value may be 1, 2, or 4.

 とありますが、VC++5のドキュメントでEnumPrintersをひくと

>Level 
>
>Specifies the type of data structures pointed to by pPrinterEnum. Valid 
>values are 1, 2, 4, and 5, which correspond to the PRINTER_INFO_1, 
>PRINTER_INFO_2, PRINTER_INFO_4, and PRINTER_INFO_5 data structures. 
>Windows 95: The value can be 1, 2, or 5. 
>Windows NT: This value can be 1, 2, 4, or 5. 

 となっています。VC++5のドキュメントではNTでLevel5が使用できるという記述
になっていますが、3.51では駄目で4.0から可能であるという情報がどこにもあり
ません。

                             98/10/20(火) ytm PAF03212@niftyserve.or.jp

Original document by ytm             氏 ID:(PAF03212)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum