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

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
    }
}

求助需求

  1. 解决AddPrinterDriver()调用失败的问题(错误码2/87)
  2. 提供更优的INF文件解析、驱动文件复制及打印机安装的实现方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:03:10