在WTL应用程序中使用已安装的打印机

在Windows应用程序中,经常需要列出所有已安装的打印机。这可以通过Win32 API中的EnumPrinters函数来实现。但是,手动处理这些API调用可能会变得复杂和繁琐。幸运的是,WTL(Windows Template Library)提供了一个方便的类CInstalledPrinters,它封装了这些调用,使得获取和显示打印机列表变得非常简单。

如何使用CInstalledPrinters类

要使用CInstalledPrinters类,首先需要包含相应的头文件:

#include "installedprinters.h"

接下来,创建一个CInstalledPrinters对象,这个对象会自动填充打印机列表。这个类继承自CSimpleArray<CString>,因此可以使用它来填充列表框,如下所示:

CListBox listbox = GetDlgItem(IDC_LIST1); CInstalledPrinters list; for(int i = 0; i < list.GetSize(); i++) listbox.AddString(list[i]);

就是这么简单,CInstalledPrinters类使用Win32的EnumPrinters API调用,使用PRINTER_INFO_5结构体,这可能是枚举打印机的最快方式(没有尝试实际打开打印机,因为如果有网络打印机安装,这可能会很慢)。

CInstalledPrinters类的实现

以下是CInstalledPrinters类的实现代码

#pragma once #include class CInstalledPrinters : public CSimpleArray { public: CInstalledPrinters(void) { GetPrinters(); } void GetPrinters(void) { DWORD dwSize = 0; DWORD dwPrinters = 0; if(!::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 5, NULL, 0, &dwSize, &dwPrinters)) { if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) return; } LPBYTE pBuffer = new BYTE [dwSize]; if(pBuffer == NULL) return; if(!::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, NULL, 5, pBuffer, dwSize, &dwSize, &dwPrinters)) { return; } if(dwPrinters == 0) return; PRINTER_INFO_5* pInfo = (PRINTER_INFO_5*)pBuffer; for(DWORD i = 0; i < dwPrinters; i++, pInfo++) Add(CString(pInfo->pPrinterName)); delete [] pBuffer; } };
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485