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

调用SetPrinter()设置打印机双面打印模式失败求助

打印机双面打印设置失败:SetPrinter()调用无效

尝试通过SetPrinter()函数设置打印机双面打印模式,但调用失败,控制台输出报错:

SetPrinter not working

以下是实现的C++代码:

bool SetDuplexMode(HANDLE hPrinter, short duplexMode) {
    PRINTER_INFO_2* pInfo = NULL;
    DWORD dwNeeded = 0;
    GetPrinter(hPrinter, 2, NULL, 0, &dwNeeded);
    pInfo = (PRINTER_INFO_2*)malloc(dwNeeded);
    if (!GetPrinter(hPrinter, 2, (LPBYTE)pInfo, dwNeeded, &dwNeeded)) {
        free(pInfo);
        return false;
    }

    DEVMODE* pDevMode = pInfo->pDevMode;
    if (!pDevMode) {
        free(pInfo);
        return false;
    }

    pDevMode->dmFields |= DM_DUPLEX;
    pDevMode->dmDuplex = duplexMode;

    if (!SetPrinter(hPrinter, 2, (LPBYTE)pInfo, 0)) {
        std::wcout << L"SetPrinter not working" << L'\n';
        free(pInfo);
        return false;
    }

    free(pInfo);
    return true;
}

排查要点

  • 权限不足:SetPrinter()需要管理员级别的打印机权限,打开打印机时必须指定PRINTER_ACCESS_ADMINISTER权限,而非仅PRINTER_ACCESS_USE。示例打开代码:

    HANDLE hPrinter = OpenPrinter(printerName, NULL, PRINTER_ACCESS_ADMINISTER);
    
  • DEVMODE只读或未正确复制:从PRINTER_INFO_2获取的pDevMode可能是只读的,需要先复制一份可修改的副本:

    DEVMODE* pNewDevMode = (DEVMODE*)malloc(pDevMode->dmSize + pDevMode->dmDriverExtra);
    memcpy(pNewDevMode, pDevMode, pDevMode->dmSize + pDevMode->dmDriverExtra);
    pNewDevMode->dmFields |= DM_DUPLEX;
    pNewDevMode->dmDuplex = duplexMode;
    pInfo->pDevMode = pNewDevMode;
    

    注意后续要释放这个新分配的DEVMODE内存。

  • 打印机不支持双面打印:先确认目标打印机本身具备双面打印能力,可通过DeviceCapabilities()查询DC_DUPLEX参数,或检查DEVMODE中dmDuplex的有效值范围。

  • 获取具体错误码:替换通用报错,调用GetLastError()拿到具体错误码,比如ERROR_ACCESS_DENIED(5)代表权限不足,ERROR_INVALID_PARAMETER(87)代表参数有误,精准定位问题:

    if (!SetPrinter(hPrinter, 2, (LPBYTE)pInfo, 0)) {
        DWORD err = GetLastError();
        std::wcout << L"SetPrinter failed, error code: " << err << L'\n';
        free(pInfo);
        return false;
    }
    
  • PRINTER_INFO_2字段完整性:修改DEVMODE后,确保pInfo其他字段(如pSecurityDescriptor)未被意外修改,保持原有值不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:04:58