Windows打印驱动安装:AddPrinterDriver调用失败(错误2/87)求助
Windows打印驱动安装程序:AddPrinterDriver调用失败问题及优化需求
问题背景
开发Windows打印驱动安装程序,目标是解析INF文件、复制所需驱动文件、添加打印机驱动并完成打印机安装。当前为XPS迷你驱动(filter.dll),从旧Pascal代码转换为C++后,仅AddPrinterDriver()调用持续失败。
初始尝试:pnputil执行成功,但AddPrinterDriver调用失败
通过CreateProcess()调用pnputil /a my.inf成功将驱动包导入驱动存储,但调用AddPrinterDriver()时持续失败,错误码为2(文件未找到)或87(参数错误),取决于pDataFile是否设为NULL。相关代码如下:
if (RunWindowsPnpUtil(thePrinterInfo)) { wstring wsDriverName = thePrinterInfo.GetPrinterName(), wsInfPath = thePrinterInfo.GetINFPath(); wstring wsDir = wsInfPath.substr(0, wsInfPath.find_last_of(L'\\')), wsINFName = wsInfPath.substr(wsInfPath.find_last_of(L'\\') + 1); DRIVER_INFO_4 driverInfo = { 0 }; memset(&driverInfo, 0, sizeof(DRIVER_INFO_3)); // 注意:此处存在错误,结构体类型与memset大小不匹配 wstring wsConfigFile = thePrinterInfo.GetConfigFile(), wsDataFile = thePrinterInfo.GetDataFile(); driverInfo.cVersion = thePrinterInfo.GetPrinterClassVersionInt(); // 指定结构体版本 driverInfo.pName = const_cast<wchar_t*>(wsDriverName.c_str()); // 驱动名称 driverInfo.pEnvironment = NULL; // 使用当前环境 driverInfo.pDriverPath = const_cast<wchar_t*>(L"UNIDRV.DLL"); // 驱动文件路径(可选) driverInfo.pDataFile = const_cast<wchar_t*>(thePrinterInfo.GetGPDFile().c_str()); // GPD文件路径 driverInfo.pConfigFile = const_cast<wchar_t*>(wsConfigFile.empty() ? L"UNIDRVUI.DLL" : wsConfigFile.c_str()); // 配置文件路径(可选) driverInfo.pHelpFile = const_cast<wchar_t*>(L"UNIDRV.HLP"); // 帮助文件路径(可选) driverInfo.pDependentFiles = NULL; // 依赖文件数组(可选) driverInfo.pMonitorName = NULL; // 监视器名称(可选) driverInfo.pDefaultDataType = NULL; // 默认数据类型(可选) // 添加打印机驱动 if (AddPrinterDriver(NULL, driverInfo.cVersion, reinterpret_cast<BYTE*>(&driverInfo)) == 0) { DWORD dwErr = GetLastError(); return false; } }
关键错误点提示
代码中memset(&driverInfo, 0, sizeof(DRIVER_INFO_3))存在明显错误:声明的结构体是DRIVER_INFO_4,但memset使用了DRIVER_INFO_3的大小,会导致结构体末尾未初始化,进而引发参数错误(错误码87)。
更新尝试:UploadPrinterDriverPackage与InstallPrinterDriverFromPackage成功,但AddPrinterDriver仍报错
后续改用UploadPrinterDriverPackage()和InstallPrinterDriverFromPackage(),两者执行返回S_OK,但调用AddPrinterDriver()仍报错误2(文件未找到),相关代码如下:
HRESULT hResult = UploadPrinterDriverPackage(NULL, wsInfPath.c_str(), wsEnv.c_str(), UPDP_CHECK_DRIVERSTORE, NULL/*GetMainWnd()*/, wszDestInfPath, &cchDestInfPath); if (hResult == S_OK) { hResult = InstallPrinterDriverFromPackage(NULL, wszDestInfPath, wsDriverName.c_str(), wsEnv.c_str(), 0); if (hResult == S_OK) { // 后续调用AddPrinterDriver仍失败,错误码2 } }
求助需求
- 解决
AddPrinterDriver()调用失败的问题(错误码2/87) - 提供更优的INF文件解析、驱动文件复制及打印机安装的实现方案
内容的提问来源于stack exchange,提问作者user9778277
相关产品推荐
相关产品推荐

