Click here to Skip to main content
14,981,532 members
Articles / Desktop Programming / WTL
Article
Posted 7 Nov 2002

Stats

69K views
1.6K downloads
15 bookmarked

WTL Installed Printers List

Rate me:
Please Sign up or sign in to vote.
5.00/5 (2 votes)
7 Nov 2002
Use this class in your WTL apps to retrieve a list of installed printers

Sample Image - WTLInstalledPrinters.jpg

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;
    }
};

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author


Comments and Discussions

 
Generalfile atlmisc.h Pin
polunga25-Jan-05 19:35
Memberpolunga25-Jan-05 19:35 
GeneralRe: file atlmisc.h Pin
Rob Caldecott25-Jan-05 21:38
MemberRob Caldecott25-Jan-05 21:38 
GeneralNetwork printers Pin
jerko22-Mar-04 2:14
Memberjerko22-Mar-04 2:14 
GeneralRe: Network printers Pin
jerko22-Mar-04 3:02
Memberjerko22-Mar-04 3:02 
GeneralRe: Network printers Pin
Steve S22-Mar-04 3:03
MemberSteve S22-Mar-04 3:03 
GeneralChoosing a printer default from the list Pin
Jo Fredrickson10-Oct-03 2:18
MemberJo Fredrickson10-Oct-03 2:18 
GeneralRe: Choosing a printer default from the list Pin
willcoxson20-Feb-04 11:25
Memberwillcoxson20-Feb-04 11:25 
GeneralRe: Choosing a printer default from the list Pin
Christopher Stratmann20-Feb-06 9:33
MemberChristopher Stratmann20-Feb-06 9:33 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.