You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何打开网络共享打印机及枚举列表?OpenPrinter API报错求助

解决OpenPrinter打开网络共享打印机报错2351的问题

1. 正确传入网络共享打印机名称

网络共享打印机的名称必须包含打印机服务器的完整路径,格式为:\\服务器主机名\打印机共享名。
你直接传入MF633C/635C只会被识别为本地打印机名称,找不到对应设备就会返回错误2351。

  • 注意:C++字符串中反斜杠需要转义,因此实际代码中要写成"\\\\服务器主机名\\MF633C/635C"。

2. 正确打开网络打印机的代码示例

修正后的完整代码如下,包含错误码获取和资源释放:

#include <windows.h>
#include <iostream>
using namespace std;

int main() {
    HANDLE hPrinter = NULL;
    // 替换为你的打印机服务器名和共享名
    LPCSTR printerName = "\\\\PrintServer\\MF633C/635C";
    BOOL success = OpenPrinter(printerName, &hPrinter, NULL);

    if (!success) {
        DWORD errorCode = GetLastError();
        cout << "打开打印机失败,错误码:" << errorCode << endl;
    } else {
        cout << "成功打开打印机" << endl;
        // 必须关闭打印机句柄释放资源
        ClosePrinter(hPrinter);
    }
    return 0;
}

3. 判断设备是否为打印机的方法

方法一:通过OpenPrinter返回值判断

若OpenPrinter返回非0,说明设备是有效打印机且成功打开;若返回0,结合错误码(如2351)可判断名称无效或设备不是打印机。

方法二:枚举系统打印机验证

使用EnumPrinters枚举所有本地和网络打印机,对比目标名称确认是否存在:

#include <windows.h>
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    DWORD dwNeeded = 0, dwReturned = 0;
    // 先获取枚举所需的缓冲区大小
    EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK, NULL, 4, NULL, 0, &dwNeeded, &dwReturned);
    
    LPBYTE pPrinterBuffer = new BYTE[dwNeeded];
    if (EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_NETWORK, NULL, 4, pPrinterBuffer, dwNeeded, &dwNeeded, &dwReturned)) {
        PRINTER_INFO_4* pPrinterInfo = reinterpret_cast<PRINTER_INFO_4*>(pPrinterBuffer);
        LPCSTR targetPrinter = "\\\\PrintServer\\MF633C/635C";
        bool exists = false;

        for (DWORD i = 0; i < dwReturned; i++) {
            if (strcmp(pPrinterInfo[i].pPrinterName, targetPrinter) == 0) {
                exists = true;
                break;
            }
        }

        cout << (exists ? "该设备是系统中的打印机" : "该设备不是打印机或未在系统中共享") << endl;
    } else {
        cout << "枚举打印机失败,错误码:" << GetLastError() << endl;
    }

    delete[] pPrinterBuffer;
    return 0;
}

4. 相关可用API汇总

  • OpenPrinter:打开打印机获取句柄,用于后续打印操作
  • ClosePrinter:关闭打印机句柄,释放系统资源
  • EnumPrinters:枚举系统内的打印机、打印服务器等设备,支持筛选本地/网络打印机
  • GetPrinter:获取打印机的详细属性(如状态、端口、驱动信息),需配合OpenPrinter使用
  • GetLastError:获取API调用的错误码,用于排查失败原因

内容的提问来源于stack exchange,提问作者Arun Arun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14