プリンタ名の列挙

(2004.03.25)
    // プリンタ名の列挙
    static HRESULT EnumPrinterNames(std::vector<CString>& strPrinterNames)
    {
        strPrinterNames.clear();
 
        OSVERSIONINFO version;
        memset(&version, 0, sizeof(version));
        version.dwOSVersionInfoSize = sizeof(version);
        ::GetVersionEx(&version);
        if (version.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
            BYTE buffer[1024 * 64];
 
            DWORD dwNeeded = 0;
            DWORD dwReturned = 0;
            BOOL br = ::EnumPrinters(
                PRINTER_ENUM_CONNECTIONS | PRINTER_ENUM_LOCAL,
                0,
                4,
                buffer,
                10240,
                &dwNeeded,
                &dwReturned);
            if (br == 0)
            {
                DWORD dwError = ::GetLastError();
                return HRESULT_FROM_WIN32(dwError);
            }
 
            BYTE* p = buffer;
            for (DWORD i = 1; i <= dwReturned; i++)
            {
                PRINTER_INFO_4* pPI4 = (PRINTER_INFO_4*)p;
 
                CString strPrinterName = (LPCSTR)pPI4->pPrinterName;
                TRACE(_T("%s\n"), (LPCSTR)strPrinterName);
                strPrinterNames.push_back(strPrinterName);
 
                p += sizeof(PRINTER_INFO_4);
            }
        }
        else if(version.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
        {
            BYTE buffer[1024 * 64];
 
            DWORD dwNeeded = 0;
            DWORD dwReturned = 0;
            BOOL br = ::EnumPrinters(
                PRINTER_ENUM_LOCAL,
                0,
                2,                                    // level
                buffer,
                10240,
                &dwNeeded,
                &dwReturned);
            if (br == 0)
            {
                DWORD dwError = ::GetLastError();
                return HRESULT_FROM_WIN32(dwError);
            }
 
            BYTE* p = buffer;
            for (DWORD i = 1; i <= dwReturned; i++)
            {
                PRINTER_INFO_2* pPI2 = (PRINTER_INFO_2*)p;
 
                CString strPrinterName = (LPCSTR)pPI2->pPrinterName;
                TRACE(_T("%s\n"), (LPCSTR)strPrinterName);
                strPrinterNames.push_back(strPrinterName);
 
                p += sizeof(PRINTER_INFO_2);
            }
        }
 
        return S_OK;
    }
一覧に戻る
© 2003 WAC.com All Right Reserved.