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
    #include

    #include
    #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