0.官方文档
EnumPrinters 函数 (Winspool.h) - Win32 apps | Microsoft Learn
1.导入需要的头文件
#include <windows.h>
#include <winspool.h>
请注意,winspool需要依赖windows中的一些内容进行初始化,所以windows.h务必定义在前面,否则会报错。
2.在项目中引入winspool.lib依赖
WinSpool.Lib
3.完整代码
#include <windows.h>
#include <winspool.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> EnumeratePrinters() {
vector<string> strResult;
DWORD needed = 0, returned = 0;
EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, NULL, 0, &needed, &returned);
BYTE* buffer = new BYTE[needed];
if (EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, needed, &needed, &returned)) {
PRINTER_INFO_4* printerInfo = (PRINTER_INFO_4*)buffer;
for (DWORD i = 0; i < returned; i++) {
strResult.push_back(printerInfo[i].pPrinterName);
}
}
delete[] buffer;
return strResult;
}
int main()
{
auto values = EnumeratePrinters();
for (size_t i = 0; i < values.size(); i++)
{
printf("%s\n" ,values[i].c_str());
}
}
4.项目字节问题
在多字节编码环境下EnumPrinters会被拓展为EnumPrintersA,在Unicode环境下,EnumPrinters会被拓展为EnumPrintersW,在编写项目时请根据自己项目编码而定。