Win32API 利用可能なプリンタを列挙する

利用可な可能なプリンタ、プリントサーバー、プリントプロバイダを列挙するためには、EnumPrinters関数を使用する。

BOOL EnumPrinters(
  DWORD Flags,         // プリンタオブジェクトのタイプ
  LPTSTR Name,         // プリンタオブジェクトの名前
  DWORD Level,         // 情報レベル
  LPBYTE pPrinterEnum, // プリンタ情報を格納するバッファ
  DWORD cbBuf,         // プリンタ情報バッファのサイズ
  LPDWORD pcbNeeded,   // 受け取ったバイト数または必要なバイト数
  LPDWORD pcReturned   // 列挙されたプリンタの数
);




<li>Flags</li>
Flagsには、列挙したいオブジェクトのタイプを指定する。
<table>
<tr><td>PRINTER_ENUM_LOCAL</td><td>ローカルにインストールされているプリンタを列挙する(Nameパラメータを無視する)</td></tr>
<tr><td>PRINTER_ENUM_NAME</td><td>Nameパラメータで指定されたプリンタ(サーバー、ドメイン、プリントプロバイダ)を列挙する。NULLを指定すると、使用可能なプリントプロバイダを列挙する</td></tr>
<tr><td>PRINTER_ENUM_SHARED</td><td>共有属性を備えているプリンタを列挙する(単独では使えない)。</td></tr>
<tr><td>PRINTER_ENUM_DEFAULT</td><td>既定のプリンタに関する情報を返す。</td></tr>
<tr><td>PRINTER_ENUM_CONNECTIONS</td><td>ユーザーがすでに接続を確立しているプリンタのリストを列挙する</td></tr>
<tr><td>PRINTER_ENUM_NETWORK</td><td>同じドメイン内のネットワークプリンタを列挙する。Levelが1の時のみ有効</td></tr>
<tr><td>PRINTER_ENUM_REMOTE</td><td>同じドメイン内のネットワークプリンタとプリントサーバーを列挙する。Levelが1の時のみ有効</td></tr>
</table>



  • pcbNeeded

  • pcbNeededは、関数が成功するとcbBufパラメータに格納されたバイト数が格納される。cbBufパラメータのサイズが小さすぎる場合は、必要なバイト数が格納される。
    必要なバイト数が不明のときは、pcbNeededに0を指定して関数を呼び出すことで、必要なバイト数を取得することができる。




  • Level

  • pPrinterEnumパラメータが指すデータ構造体のタイプ。指定できる値は1,2,4,5。
    それぞれ、PRINTER_INFO_1, PRINTER_INFO_2, PRINTER_INFO_4, PRINTER_INFO_5に対応している。


    例として、PRINTER_INFO_1構造体は以下のように定義されている。

    typedef struct _PRINTER_INFO_1 {
      DWORD  Flags;
      LPTSTR pDescription;
      LPTSTR pName;
      LPTSTR pComment;
    } PRINTER_INFO_1, *PPRINTER_INFO_1;





    EnumPrinters関数の使用例

    ここでは、構造体はレベル1(PRINTER_INFO_1)を用いている。1度プリンタ情報を格納するために必要なバイト数を取得し、動的にバッファを確保してからプリンタ情報を取得している。

    #include <windows.h>
    #include <stdio.h>
    
    #include <winspool.h>
    #pragma comment(lib, "winspool.lib")
    
    int main()
    {
        PRINTER_INFO_1 *pInfo;
        LPBYTE pPrinterEnum;
        DWORD dwNeeded;
        DWORD dwReturned;
        DWORD i;
    
    
        //pcbNeededに0を指定して、情報を格納するのに必要なバイト数を取得
        EnumPrinters(PRINTER_ENUM_LOCAL,
            NULL,
            1,
            NULL,
            0,
            &dwNeeded,
            &dwReturned);
    
        //必要なサイズのバッファを確保
        pPrinterEnum = (LPBYTE)LocalAlloc(LPTR, dwNeeded);
        if (pPrinterEnum == NULL) {
            return 1;
        }
    
        //実際に、プリンタ情報を取得
        EnumPrinters(PRINTER_ENUM_LOCAL,
            NULL,
            1,
            pPrinterEnum,
            dwNeeded,
            &dwNeeded,
            &dwReturned);
    
        pInfo = (PRINTER_INFO_1 *)pPrinterEnum;
    
        for (i = 0; i < dwReturned; i++) {
            wprintf(L"---------------------------------------------\n");
            wprintf(L"Name: %s\n", pInfo->pName);
            wprintf(L"Description: %s\n", pInfo->pDescription);
            wprintf(L"Comment: %s\n", pInfo->pComment);
            wprintf(L"\n");
    		pInfo++;
        }
    
        LocalFree(pPrinterEnum);
    
        return 0;
    }



    実行結果(自分の開発環境にて)

    ---------------------------------------------
    Name: PDF Complete
    Description: PDF Complete,PDF Complete Converter,
    Comment: PDF Document Creator
    
    ---------------------------------------------
    Name: Microsoft XPS Document Writer
    Description: Microsoft XPS Document Writer,Microsoft XPS Document Writer,
    Comment:
    
    ---------------------------------------------
    Name: HP Officejet H470 series
    Description: HP Officejet H470 series,HP Officejet H470 series,
    Comment:
    
    ---------------------------------------------
    Name: Fax
    Description: Fax,Microsoft Shared Fax Driver,
    Comment:
    
    ---------------------------------------------
    Name: Adobe PDF
    Description: Adobe PDF,Adobe PDF Converter,
    Comment:






    参考:
    http://msdn.microsoft.com/ja-jp/library/cc428573.aspx
    http://msdn.microsoft.com/ja-jp/library/dd162844.aspx