Win32API プリンタの構成要素を列挙する EnumPrinterData

プリンタの構成要素を列挙するためには、EnumePrinterData関数を用いる。

DWORD EnumPrinterData(
  HANDLE hPrinter,       // 操作対象のプリンタを識別するハンドル
  DWORD dwIndex,         // 取得する値のインデックス
  LPTSTR pValueName,     // 値の名前を受け取るバッファへのポインタ
  DWORD cbValueName,     // 値の名前を受け取るバッファのサイズ (バイト数)
  LPDWORD pcbValueName,  // バッファ pValueName に格納された名前のバイト数を
                              // 受け取る変数へのポインタ
  LPDWORD pType,         // 値のタイプコードを受け取る変数へのポインタ
  LPBYTE pData,          // 値のデータを受け取るバッファへのポインタ
  DWORD cbData,          // 値のデータを受け取るバッファのサイズ (バイト数)
  LPDWORD pcbData        // バッファ pData に格納されたデータのバイト数を
                             // 受け取る変数へのポインタ
);



  • Microsoft XPS Document Writer」の構成要素を列挙するサンプルプログラム
  • #include <windows.h>
    #include <stdio.h>
    
    #include <winspool.h>
    #pragma comment(lib, "winspool.lib")
    
    int main()
    {
        HANDLE hPrinter;
        DWORD i;
        DWORD dwRet;
        LPTSTR pValueName;
        DWORD dwMaxValueNameSize;
        DWORD dwType;
        DWORD dwMaxDataSize;
        LPBYTE lpData;
        DWORD dwValueNameSize;
        DWORD dwDataSize;
    
        if (OpenPrinter(TEXT("Microsoft XPS Document Writer"), &hPrinter, NULL) == FALSE) {
            puts("OpenPrinter failed");
            return 1;
        }
    
        i = 0;
        dwRet = EnumPrinterData(hPrinter,
                i,
                NULL,
                0,
                &dwMaxValueNameSize,
                &dwType,
                NULL,
                0,
                &dwMaxDataSize);
    
        pValueName = (LPTSTR)LocalAlloc(LPTR, dwMaxValueNameSize);
        if (pValueName == NULL) {
            goto EXIT_FUNC;
        }
        
        lpData = (LPBYTE)LocalAlloc(LPTR, dwMaxDataSize);
        if (lpData == NULL) {
            goto EXIT_FUNC;
        }
    
        while (true) { 
            dwValueNameSize = dwMaxValueNameSize;
            dwDataSize = dwMaxDataSize;
            
            dwRet = EnumPrinterData(hPrinter,
                i++,
                pValueName,
                dwValueNameSize,
                &dwValueNameSize,
                &dwType,
                (LPBYTE)lpData,
                dwDataSize,
                &dwDataSize);
    
            if (dwRet == ERROR_NO_MORE_ITEMS || dwRet != ERROR_SUCCESS) {
                break;
            }
    
            switch (dwType) {
            case REG_SZ:
                wprintf(L"REG_SZ - ValueName: %s, Data: %s\n", pValueName, lpData);
                break;
    
            case REG_DWORD:
                DWORD n;
                memcpy(&n, lpData, sizeof(n));
                wprintf(L"REG_DWORD - ValueName: %s, Data: %u\n", pValueName, n);
                break;
    
            case REG_MULTI_SZ:
                wprintf(L"REG_MULTI_SZ - ValueName: %s\n", pValueName);
                break;
    
            case REG_BINARY:
                wprintf(L"REG_BINARY - ValueName: %s\n", pValueName);
                break;
    
            case REG_DWORD_BIG_ENDIAN:
                wprintf(L"REG_DWORD_BIG_ENDIAN - ValueName: %s\n", pValueName);
                break;
    
            case REG_EXPAND_SZ:
                wprintf(L"REG_EXPAND_SZ - ValueName: %s\n", pValueName);
                break;
    
            case REG_LINK:
                wprintf(L"REG_LINK - ValueName: %s\n", pValueName);
                break;
    
            case REG_NONE:
                wprintf(L"REG_NONE - ValueName: %s\n", pValueName);
                break;
    
            case REG_RESOURCE_LIST:
                wprintf(L"REG_RESOURCE_LIST - ValueName: %s\n", pValueName);
                break;
         
            default:
                wprintf(L"Default: %s\n", pValueName);
                break;
            }
        }
    
    
    EXIT_FUNC:
    
        LocalFree(pValueName);
        LocalFree(lpData);
        ClosePrinter(hPrinter);
    
        return 0;
    }


  • 実行結果
  • REG_DWORD - ValueName: InitDriverVersion, Data: 1536
    REG_SZ - ValueName: Model, Data: Microsoft XPS Document Writer
    REG_DWORD - ValueName: PrinterDataSize, Data: 560
    REG_BINARY - ValueName: PrinterData
    REG_DWORD - ValueName: FeatureKeywordSize, Data: 2
    REG_BINARY - ValueName: FeatureKeyword
    REG_DWORD - ValueName: Forms?, Data: 1928778442




  • 実行結果その2 「Adobe PDF」の構成要素を列挙した場合(OpenPrinter関数の第1引数に"Adobe PDF"を指定した)
  • REG_DWORD - ValueName: InitDriverVersion, Data: 1536
    REG_DWORD - ValueName: FreeMem, Data: 4096
    REG_DWORD - ValueName: JobTimeOut, Data: 600
    REG_DWORD - ValueName: Protocol, Data: 0
    REG_DWORD - ValueName: PrinterDataSize, Data: 560
    REG_BINARY - ValueName: PrinterData
    REG_DWORD - ValueName: FeatureKeywordSize, Data: 24
    REG_BINARY - ValueName: FeatureKeyword
    REG_DWORD - ValueName: Forms?, Data: 582377160
    REG_MULTI_SZ - ValueName: DependentFiles
    REG_BINARY - ValueName: HostFontExceptFonts
    REG_BINARY - ValueName: HostFontExceptCIDFonts
    REG_DWORD - ValueName: DistillerHostFontHasMostFonts, Data: 1
    REG_DWORD - ValueName: ViewPrintOutput, Data: 1
    REG_DWORD - ValueName: PromptForFileName, Data: 1
    REG_DWORD - ValueName: DeleteLogFiles, Data: 1
    REG_DWORD - ValueName: AddDocInfo, Data: 1
    REG_DWORD - ValueName: AskToReplacePDF, Data: 0




    参考
    http://msdn.microsoft.com/ja-jp/library/cc428561.aspx