PB 電子会議室

コメント

発言No. 更新日 題名(クリックすると発言内容と関連するコメントが表示されます)
17181 02/03/31 16:28:37 RE(8):PB7.0: Windows API \"EnumPrinters\"は使用できる? By tomox2
17179 02/03/29 23:15:22 RE(7):PB7.0: Windows API \"EnumPrinters\"は使用できる? By Taka
17178 02/03/29 22:12:37 RE(6):PB7.0: Windows API \"EnumPrinters\"は使用できる? By tomox2
17165 02/03/28 13:06:40 RE(5):Windows API \"EnumPrinters\" の使い方 の補足 By Taka
17164 02/03/28 12:06:06 RE(4):Windows API \"EnumPrinters\" の使い方 By にしやん
17162 02/03/27 18:56:06 RE(3):PB7.0: Win32API \"EnumPrinters\" を使用せずにプリンタ一覧を取得する方法 By M.M
17158 02/03/26 22:04:09 RE(2):PB7.0: Windows API \"EnumPrinters\"は使用できる? By tomox2
17155 02/03/26 21:40:37 RE(1):PB7.0: Windows API \"EnumPrinters\"は使用できる? By M.M
17154 02/03/26 21:05:07 PB7.0: Windows API \"EnumPrinters\"は使用できる? By tomox2

カテゴリ:PowerBuilderの開発環境
日付:2002年03月28日 12:06 発信者:にしやん
題名:RE(4):Windows API \"EnumPrinters\" の使い方

tomox2さん、こんにちは。

EnumPrintersを使うのにコールバック関数は必要ないはずです。
以下は、使用できるプリンタ名の一覧を取得する方法です。

構造体
PRINTER_INFO_5
 UnsignedLong pPrinterName
 UnsignedLong pPortName
 UnsignedLong Attributes
 UnsignedLong DeviceNotSelectedTimeout
 UnsignedLong TransmissionRetryTimeout

外部関数
FUNCTION Boolean EnumPrinters(UnsignedLong Flags, UnsignedLong Name,&
    UnsignedLong Level, REF Blob pPrinterEnum,UnsignedLong cbBuf,&
    REF UnsignedLong pcbNeeded, REF UnsignedLong pcReturned)&
    LIBRARY \"WINSPOOL.DRV\" ALIAS FOR \"EnumPrintersA\"
SUBROUTINE MemMove(REF Structure dst[],REF Blob src,Long len)&
    LIBRARY \"KERNEL32.DLL\" ALIAS FOR \"RtlMoveMemory\"

スクリプト
//定数宣言
CONSTANT UnsignedLong PRINTER_ENUM_LOCAL = 2

//変数宣言
String PrinterList[]
Blob PrinterInfoBlob
PRINTER_INFO_5 PrinterInfo[], PrinterInfoDefault
Boolean ret
UnsignedLong cbNeeded, cReturned, p

//必要な領域サイズ取得
ret = EnumPrinters(PRINTER_ENUM_LOCAL, 0, 5, PrinterInfoBlob, 0, cbNeeded, cReturned)
IF cbNeeded > 0 THEN
  //領域確保
  PrinterInfoBlob = Blob(Space(cbNeeded))
  //プリンタ情報を取得
  ret = EnumPrinters(PRINTER_ENUM_LOCAL, 0, 5, PrinterInfoBlob, cbNeeded, cbNeeded, cReturned)
END IF
IF ret AND cReturned > 0 THEN
  //構造体配列にコピー
  PrinterInfo[cReturned] = PrinterInfoDefault
  MemMove(PrinterInfo, PrinterInfoBlob, 20 * cReturned) //20は構造体のサイズ
  //プリンタ名を取得
  FOR p = 1 TO cReturned
    PrinterList[p] = String(PrinterInfo[p].pPrinterName, \"address\")
  NEXT
ELSE
  //取得できない
END IF

※WinNT/2000では、Level=4(PRINTER_INFO_4)の方が速いらしいです。
 PRINTER_INFO_4構造体の内容は、winspool.hを参照してください。
 ただし、Win9xではLevel=4は使えません。

付加情報:

PowerBuilder Version (記載なし)

Client SoftWare

OS Windows 2000
DBMS (記載なし)
Browser (記載なし)

Server SoftWare

OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)

PowerSpaceの運営は、パワーフューチャー株式会社が行っております。
Copyright © 2013 Power Future Co., Ltd.