// プリンタ名の列挙
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;
}