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




  • 構造体レベルを「1」にした場合の、EnumPorts関数の使用例を以下に示す。
  • #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:





  • 構造体レベルを「2」にした場合の、EnumPorts関数の使用例を以下に示す。
  • #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