概要
EnumPrintersを用いてプリンタ名の一覧を標準出力に出力します。コマンドプロンプトで動作します。
以下に動作例とWindowsでのプリンタ一覧を示します。
PaperPort Image Printer
OneNote 2010 に送る
Microsoft XPS Document Writer
Fax
Brother DCP-J572N Printer
Adobe PDF
Returnキーを押すと終了します。
テスト環境
コンパイラ
Visual C++ 2013 Express 32/64bit
プログラムソースの概要
_tmain関数
Windowsから最初に_tmain関数が呼び出されます。
EnumPrinters APIでプリンタ名の列挙に必要なメモリのバイト数を求めるためにメモリサイズ0を指定してEnumPrinters APIを呼び出し、必要なメモリサイズを取得します。この環境では1000バイトが返されました。
ここではローカルプリンタしか確認できない環境ですのでPRINTER_ENUM_LOCALを指定しています。
LocalAlloc APIでメモリを確保しゼロクリアします。
EnumPrinters APIに確保したメモリのアドレスとサイズを指定して呼び出すと、プリンタ情報の一覧が指定したメモリに複写されます。メモリはPRINTER_INFO_1の配列ですのでprnInfoポインタにキャストします。
後は、プリンタの数だけprnInfo配列をアクセスしてプリンタ名を表示します。
LocalFree APIでLocalAlloc APIで確保したメモリを解放します。
プログラムソース
// プリンタの一覧を標準出力に表示
// Visual C++ 2013 32/64bit
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
void _tmain(void){
// UNICODE文字を標準出力に正しく表示させるためにロケールを設定
_tsetlocale(LC_ALL, _TEXT(""));
DWORD dwNeeded,dwRet,i;
PRINTER_INFO_1 *prnInfo;
LPBYTE pPrnEnum;
// プリンタの名前等に必要なバイト数を取得
EnumPrinters(PRINTER_ENUM_LOCAL,// ←ローカルプリンタを対象
NULL,1,NULL,0,&dwNeeded,&dwRet);
pPrnEnum = (LPBYTE)LocalAlloc(LPTR, dwNeeded);// メモリを確保
if (pPrnEnum == NULL){
return;
}
// プリンタの情報を取得
EnumPrinters(PRINTER_ENUM_LOCAL,NULL,1,pPrnEnum,dwNeeded,&dwNeeded, &dwRet);
prnInfo = (PRINTER_INFO_1 *)pPrnEnum;
for (i = 0; i < dwRet; i++)
_putts(prnInfo[i].pName); // プリンタ名の表示
LocalFree(pPrnEnum); // メモリを解放
_tprintf(_TEXT("Returnキーを押すと終了します。¥n"));
getchar();
}
ソースファイルと実行ファイルのダウンロード