调用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
相关产品推荐
相关产品推荐

