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