Win32API プリンタ情報を取得する
プリンタ情報を取得するためには、GetPrinter関数を用いる。
GetPrinter関数でプリンタ情報を取得するためには、以下の3つの手順が必要となる
また、OpenPrinter関数、GetPrinter関数、ClosePrinter関数を使用するためには、「winspool.h」をインクルードし、「winspool.lib」をリンクする必要がある。
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;ここでは、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