在Windows应用程序中,经常需要列出所有已安装的打印机。这可以通过Win32 API中的EnumPrinters
函数来实现。但是,手动处理这些API调用可能会变得复杂和繁琐。幸运的是,WTL(Windows Template Library)提供了一个方便的类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
类的实现代码:
#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;
}
};