Win32API 印刷に利用可能なポートを列挙する
Win32API 印刷に利用可能なポートを列挙するためには、EnumPorts関数を用いる。
EnumPorts関数は以下のように定義されている。
BOOL EnumPorts( LPTSTR pName, // サーバー名へのポインタ(NULLを指定した場合は、ローカルコンピュータのプリンタポートが列挙される) DWORD Level, // ポート情報構造体の種類 LPBYTE pPorts, // ポート情報構造体の配列を受け取る // バッファへのポインタ DWORD cbBuf, // バッファのサイズ (バイト数) LPDWORD pcbNeeded, // バッファに格納されたバイト数 // (または必要なバッファサイズ) へのポインタ LPDWORD pcReturned // バッファに格納された PORT_INFO_*. 構造体 // の数へのポインタ );
第2引数のLevelは、構造体のレベルを指定する。Levelに「1」を指定した場合は、第3引数のpPortsにPORT_INFO_1構造体へのポインタを指定し、「2」を指定した場合は、pPortsにPORT_INFO_2構造体へのポインタを指定する。
PORT_INFO_1構造体は、winspool.hにて以下のように定義されている
typedef struct _PORT_INFO_1 { LPTSTR pName;//サポートされているプリンタポート名 } PORT_INFO_1, *PPORT_INFO_1;
PORT_INFO_2構造体は、winspool.hにて以下のように定義されている
typedef struct _PORT_INFO_2 { LPTSTR pPortName;//サポートされているプリンタポート名 LPTSTR pMonitorName;//設置されているモニター(NULLとなる可能性がある) LPTSTR pDescription;//より詳細なポートの説明 DWORD fPortType;//ポートタイプのビットマスクによる記述 DWORD Reserved;//予約 } PORT_INFO_2, *PPORT_INFO_2;
fPortTypeは、以下の値の組み合わせを取り得る。
PORT_TYPE_WRITE |
PORT_TYPE_READ |
PORT_TYPE_REDIRECTED |
PORT_TYPE_NET_ATTACHED |
#include <windows.h> #include <stdio.h> #include <winspool.h> #pragma comment(lib, "winspool.lib") int main() { PORT_INFO_1A *pInfo; LPBYTE lpBuffer; DWORD dwNeeded; DWORD dwReturned; DWORD i; EnumPortsA(NULL, 1, NULL, 0, &dwNeeded, &dwReturned); lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwNeeded); if (lpBuffer == NULL) { return 1; } EnumPortsA(NULL, 1, (LPBYTE)lpBuffer, dwNeeded, &dwNeeded, &dwReturned); for (i = 0, pInfo = (PORT_INFO_1A *)lpBuffer; i < dwReturned; i++, pInfo++) { printf("%s\n", pInfo->pName); } LocalFree(lpBuffer); return 0; }
実行結果(拙者の開発環境(Windows Vista)にて)
COM1: COM2: COM3: COM4: FILE: LPT1: LPT2: LPT3: XPSPort:
#include <windows.h> #include <stdio.h> #include <winspool.h> #pragma comment(lib, "winspool.lib") int main() { PORT_INFO_2A *pInfo; LPBYTE lpBuffer; DWORD dwNeeded; DWORD dwReturned; DWORD i; EnumPortsA(NULL, 2, NULL, 0, &dwNeeded, &dwReturned); lpBuffer = (LPBYTE)LocalAlloc(LPTR, dwNeeded); if (lpBuffer == NULL) { return 1; } EnumPortsA(NULL, 2, (LPBYTE)lpBuffer, dwNeeded, &dwNeeded, &dwReturned); for (i = 0, pInfo = (PORT_INFO_2A *)lpBuffer; i < dwReturned; i++, pInfo++) { printf("//////////////////////////////////////\n"); printf("PortName: %s\n", pInfo->pPortName); printf("MonitorName: %s\n", pInfo->pMonitorName); printf("Description: %s\n", pInfo->pDescription); printf("PORT_TYPE_WRITE: %s\n", (pInfo->fPortType & PORT_TYPE_WRITE) ? "True" : "False"); printf("PORT_TYPE_READ: %s\n", (pInfo->fPortType & PORT_TYPE_READ) ? "True" : "False"); printf("PORT_TYPE_REDIRECTED: %s\n", (pInfo->fPortType & PORT_TYPE_REDIRECTED) ? "True" : "False"); printf("PORT_TYPE_NET_ATTACHED: %s\n", (pInfo->fPortType & PORT_TYPE_NET_ATTACHED) ? "True" : "False"); printf("\n"); } LocalFree(lpBuffer); return 0; }
実行結果
////////////////////////////////////// PortName: COM1: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: COM2: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: COM3: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: COM4: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: FILE: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: LPT1: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: LPT2: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: LPT3: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False ////////////////////////////////////// PortName: XPSPort: MonitorName: ローカル モニタ Description: ローカル ポート PORT_TYPE_WRITE: True PORT_TYPE_READ: True PORT_TYPE_REDIRECTED: False PORT_TYPE_NET_ATTACHED: False
参考
PORT_INFO_1
http://msdn.microsoft.com/en-us/library/dd162822.aspx
PORT_INFO_2
http://msdn.microsoft.com/en-us/library/dd162823.aspx
EnumPorts関数
http://msdn.microsoft.com/ja-jp/library/cc428557.aspx