WTLVisual Studio 6Visual C++ 7.0Windows 2000Visual C++ 6.0Windows XPIntermediateDevVisual StudioWindowsC++
WTL Installed Printers List





5.00/5 (2 votes)
Nov 8, 2002

75713

1674
Use this class in your WTL apps to retrieve a list of installed printers
Introduction
Want to fetch an array of installed printers for use in your WTL apps? Easy - just use this class.
First, include the header:
#include "installedprinters.h"
Next, simply create a CInstalledPrinters
object and the array will be populated automatically. This class is derived from CSimpleArray<CString>
, so you can, for example, fill a listbox using the following code:
CListBox listbox = GetDlgItem(IDC_LIST1); // Get the list of installed printers CInstalledPrinters list; // Fill listbox for (int i = 0; i < list.GetSize(); i++) listbox.AddString(list[i]);
It's as easy as that, The class will use the Win32 EnumPrinters
API call, using PRINTER_INFO_5
structures - which is probably the fastest way to enumerate printers (no attempt is made to actually open the printer, as this can be slow if you have network printers installed).
CInstalledPrinters
#pragma once #include <atlmisc.h> class CInstalledPrinters : public CSimpleArray<CString> { public: CInstalledPrinters(void) { GetPrinters(); } void GetPrinters(void) { DWORD dwSize = 0; DWORD dwPrinters = 0; // Enumerate all installed printers if (!::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 5, NULL, 0, &dwSize, &dwPrinters)) { // Check for ERROR_INSUFFICIENT_BUFFER // If something else, then quit if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) return; // Fall through } // Allocate some buffer memory LPBYTE pBuffer = new BYTE [dwSize]; if (pBuffer == NULL) return; // Fill the buffer // Again, this depends on the O/S if (!::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters)) { // Error - unlikely though // as first call to EnumPrinters // succeeded! return; } // Do we have any printers? if (dwPrinters == 0) return; // Cast to PRINTER_INFO_2 PRINTER_INFO_5* pInfo = (PRINTER_INFO_5*)pBuffer; // Loop adding the printers to the list for (DWORD i = 0; i < dwPrinters; i++, pInfo++) Add(CString(pInfo->pPrinterName)); delete [] pBuffer; } };