Win32API プリンタ情報を取得する

プリンタ情報を取得するためには、GetPrinter関数を用いる。

GetPrinter関数でプリンタ情報を取得するためには、以下の3つの手順が必要となる


  • 1.OpenPrinter関数で取得したいプリンタのハンドルを取得する

  • 2.GetPrinter関数に 1で取得したハンドルを指定して、プリンタ情報を取得する

  • 3.ClosePrinter関数でプリンタのハンドルを閉じる

  • また、OpenPrinter関数、GetPrinter関数、ClosePrinter関数を使用するためには、「winspool.h」をインクルードし、「winspool.lib」をリンクする必要がある。

  • GetPrinter関数について

  • GetPrinter関数のプロトタイプは、以下のようになっている

    BOOL GetPrinter(
      HANDLE hPrinter,    // 調査対象のプリンタを識別するハンドル
      DWORD Level,        // プリンタ情報データ構造体のバージョン
      LPBYTE pPrinter,    // プリンタ情報構造体を受け取るバイト配列へのポインタ
      DWORD cbBuf,        // pPrinter が指すバッファのサイズ (バイト数)
      LPDWORD pcbNeeded   // 取得した (必要な) バイト数を受け取る変数へのポインタ
    );


    第二引数のLevelは、プリンタ情報データ構造体のバージョンであり、「winspool.h」にPRINTER_INFO_1からPRINTER_INFO_7の7つのバージョン(Visual Studio 2005の場合)がある。また、各バージョンの構造体には、ANSIバージョンとUNICODEバージョンがある。


    第三引数のpPrinterには、第二引数で指定した構造体のバージョンに対するプリンタ情報構造体へのポインタを指定する。例えば、Levelに「1」を指定した場合は、pPrinterには「PRINTER_INFO_1構造体」へのポインタを指定することになる。



    例として、PRINTER_INFO_1W構造体の定義をwinspool.hより抜粋する

    typedef struct _PRINTER_INFO_1W {
        DWORD   Flags;
        LPWSTR  pDescription;
        LPWSTR  pName;
        LPWSTR  pComment;
    } PRINTER_INFO_1W, *PPRINTER_INFO_1W, *LPPRINTER_INFO_1W;





  • GetPrinter関数の使用例

  • ここでは、Windows Vista上で「Microsoft XPS Document Writer」の情報をPRINTER_INFO1構造体に取得している。

    #include <windows.h>
    #include <stdio.h>
    
    #include <winspool.h>
    #pragma comment(lib, "winspool.lib")
    
    int main()
    {
        HANDLE hPrinter;
        LPBYTE pPrinter;
        DWORD dwNeeded;
        PRINTER_INFO_1W *pInfo;
    
        if (!OpenPrinter(TEXT("Microsoft XPS Document Writer"), &hPrinter, NULL)) {
            return 1;
        }
    
    
        GetPrinter(hPrinter,
            1,
            NULL,
            0,
            &dwNeeded);
    
        pPrinter = (LPBYTE)LocalAlloc(LPTR, dwNeeded);
        if (pPrinter == NULL) {
            ClosePrinter(hPrinter);
            return 1;
        }
    
    
        GetPrinter(hPrinter,
            1,
            pPrinter,
            dwNeeded,
            &dwNeeded);
    
        pInfo = (PRINTER_INFO_1W *)pPrinter;
    
        wprintf(L"Name: %s\n", pInfo->pName);
        wprintf(L"Description: %s\n", pInfo->pDescription);
        wprintf(L"Comment: %s\n", pInfo->pComment);
    
    
        ClosePrinter(hPrinter);
        LocalFree(pPrinter);
    
        return 0;
    }


  • 実行結果
  • Name: Microsoft XPS Document Writer
    Description: Microsoft XPS Document Writer,Microsoft XPS Document Writer,
    Comment:





    参考
    http://msdn.microsoft.com/ja-jp/library/cc410486.aspx OpenPrinter
    http://msdn.microsoft.com/ja-jp/library/cc410413.aspx GetPrinter
    http://msdn.microsoft.com/ja-jp/library/cc428316.aspx ClosePrinter
    http://msdn.microsoft.com/en-us/library/dd162844.aspx PRINTER_INFO_1