searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

打印机驱动提取及安装

2024-05-20 07:56:02
687
0

一、驱动提取

(一)方式一

  1. win + r 键打开运行,输入printmanagement.msc 打开打印管理
  2. 点击“打印服务器”-》“本地” -》打印机
  3. 找到想要拷贝驱动的“打印机名称“及"驱动程序名",例如HP Officejet Pro 6230,驱动程序名为HP Officejet Pro 6230。

4. 点击“打印服务器”-》“本地” -》驱动程序,找到“”驱动程序名“的“inf路径”。

5.打开该路径,拷贝该目录到云电脑

(二)方式二

有些window终端没有安装打印管理,则需要用程序找到打印机所用的inf文件。输入为打印机名称,输出为inf文件路径。

例如输入“HP Officejet Pro 6230“,输出“C:\Users\ctyun\Desktop\hpvyt14.inf_amd64_957148b2911c77a2\hpvyt14.inf“

get_printer_inf_path(std::string printerName) {
    CP_LOG_INFO("control panel printerName: %s", printerName.c_str());
    std::string infPath = "";
    DWORD numPrinters;
    DWORD bufferSize = 0;
    DWORD bytesNeeded;
    // 第一次调用获取所需缓冲区大小
    EnumPrinters(PRINTER_ENUM_LOCAL, nullptr, 2, nullptr, 0, &bufferSize, &numPrinters);
    if (bufferSize == 0)
    {
        CP_LOG_WARNING("EnumPrinters, No printers found.");
        return infPath;
    }
    // 分配缓冲区
    BYTE* buffer = new BYTE[bufferSize];
    // 第二次调用获取打印机信息
    if (EnumPrinters(PRINTER_ENUM_LOCAL, nullptr, 2, buffer, bufferSize, &bytesNeeded, &numPrinters))
    {
        PRINTER_INFO_2* printerInfo = reinterpret_cast<PRINTER_INFO_2*>(buffer);
        for (DWORD i = 0; i < numPrinters; i++)
        {
            std::wstring wPrinterName = (printerInfo[i].pPrinterName);
            std::string printerName_ = wstring_to_string(wPrinterName);
            CP_LOG_DEBUG("control panel Name: %s", printerName_.c_str());
            if (printerName_ == printerName) {
                // 获取打印机句柄
                HANDLE hPrinter;
                if (OpenPrinter(printerInfo[i].pPrinterName, &hPrinter, nullptr))
                {
                    DWORD cbNeeded = 0;
                    if (!GetPrinterDriver(hPrinter, NULL, 8, NULL, 0, &cbNeeded) && cbNeeded > 0) {
                        LPBYTE pDriverInfo = new BYTE[cbNeeded];
                        if (GetPrinterDriver(hPrinter, NULL, 8, pDriverInfo, cbNeeded, &cbNeeded)) {
                            DRIVER_INFO_8* pDriverInfo8 = reinterpret_cast<DRIVER_INFO_8*>(pDriverInfo);
                            if (pDriverInfo8->pName) {
                                std::wstring wDriverName = (pDriverInfo8->pName);
                                std::string driverName = wstring_to_string(wDriverName);
                                if (driverName != "" && driverName.c_str())
                                    CP_LOG_INFO("DriverName: %s", driverName.c_str());
                            }
                            if (pDriverInfo8->pszInfPath) {
                                std::wstring wInfPath = (pDriverInfo8->pszInfPath);
                                infPath = wstring_to_string(wInfPath);
                                if (infPath != "" && infPath.c_str())
                                    CP_LOG_INFO("infPath: %s", infPath.c_str());
                            }
                        }
                        else {
                            CP_LOG_WARNING("Failed to get printer driver information. Error code: %d",GetLastError());
                        }
                        delete[] pDriverInfo;
                    }
                }
                else {
                    CP_LOG_WARNING("Failed to OpenPrinter. Error code: %d",GetLastError());
                }

                ClosePrinter(hPrinter);
            }
        }
    }
    else
    {
        CP_LOG_WARNING("Failed to EnumPrinters. Error code: %d",GetLastError());
    }
    // 释放缓冲区
    delete[] buffer;

    return infPath;
}

获取该inf路径后,打开该路径,拷贝inf文件所在的目录到云电脑

二、驱动安装

(一)方式一

打开目录,找到inf后缀的文件,右键选择“安装”。

(二)方式二

打开命令行,用 “pnputil.exe -a inf文件路径" 安装

0条评论
0 / 1000
谢****廉
3文章数
1粉丝数
谢****廉
3 文章 | 1 粉丝
谢****廉
3文章数
1粉丝数
谢****廉
3 文章 | 1 粉丝
原创

打印机驱动提取及安装

2024-05-20 07:56:02
687
0

一、驱动提取

(一)方式一

  1. win + r 键打开运行,输入printmanagement.msc 打开打印管理
  2. 点击“打印服务器”-》“本地” -》打印机
  3. 找到想要拷贝驱动的“打印机名称“及"驱动程序名",例如HP Officejet Pro 6230,驱动程序名为HP Officejet Pro 6230。

4. 点击“打印服务器”-》“本地” -》驱动程序,找到“”驱动程序名“的“inf路径”。

5.打开该路径,拷贝该目录到云电脑

(二)方式二

有些window终端没有安装打印管理,则需要用程序找到打印机所用的inf文件。输入为打印机名称,输出为inf文件路径。

例如输入“HP Officejet Pro 6230“,输出“C:\Users\ctyun\Desktop\hpvyt14.inf_amd64_957148b2911c77a2\hpvyt14.inf“

get_printer_inf_path(std::string printerName) {
    CP_LOG_INFO("control panel printerName: %s", printerName.c_str());
    std::string infPath = "";
    DWORD numPrinters;
    DWORD bufferSize = 0;
    DWORD bytesNeeded;
    // 第一次调用获取所需缓冲区大小
    EnumPrinters(PRINTER_ENUM_LOCAL, nullptr, 2, nullptr, 0, &bufferSize, &numPrinters);
    if (bufferSize == 0)
    {
        CP_LOG_WARNING("EnumPrinters, No printers found.");
        return infPath;
    }
    // 分配缓冲区
    BYTE* buffer = new BYTE[bufferSize];
    // 第二次调用获取打印机信息
    if (EnumPrinters(PRINTER_ENUM_LOCAL, nullptr, 2, buffer, bufferSize, &bytesNeeded, &numPrinters))
    {
        PRINTER_INFO_2* printerInfo = reinterpret_cast<PRINTER_INFO_2*>(buffer);
        for (DWORD i = 0; i < numPrinters; i++)
        {
            std::wstring wPrinterName = (printerInfo[i].pPrinterName);
            std::string printerName_ = wstring_to_string(wPrinterName);
            CP_LOG_DEBUG("control panel Name: %s", printerName_.c_str());
            if (printerName_ == printerName) {
                // 获取打印机句柄
                HANDLE hPrinter;
                if (OpenPrinter(printerInfo[i].pPrinterName, &hPrinter, nullptr))
                {
                    DWORD cbNeeded = 0;
                    if (!GetPrinterDriver(hPrinter, NULL, 8, NULL, 0, &cbNeeded) && cbNeeded > 0) {
                        LPBYTE pDriverInfo = new BYTE[cbNeeded];
                        if (GetPrinterDriver(hPrinter, NULL, 8, pDriverInfo, cbNeeded, &cbNeeded)) {
                            DRIVER_INFO_8* pDriverInfo8 = reinterpret_cast<DRIVER_INFO_8*>(pDriverInfo);
                            if (pDriverInfo8->pName) {
                                std::wstring wDriverName = (pDriverInfo8->pName);
                                std::string driverName = wstring_to_string(wDriverName);
                                if (driverName != "" && driverName.c_str())
                                    CP_LOG_INFO("DriverName: %s", driverName.c_str());
                            }
                            if (pDriverInfo8->pszInfPath) {
                                std::wstring wInfPath = (pDriverInfo8->pszInfPath);
                                infPath = wstring_to_string(wInfPath);
                                if (infPath != "" && infPath.c_str())
                                    CP_LOG_INFO("infPath: %s", infPath.c_str());
                            }
                        }
                        else {
                            CP_LOG_WARNING("Failed to get printer driver information. Error code: %d",GetLastError());
                        }
                        delete[] pDriverInfo;
                    }
                }
                else {
                    CP_LOG_WARNING("Failed to OpenPrinter. Error code: %d",GetLastError());
                }

                ClosePrinter(hPrinter);
            }
        }
    }
    else
    {
        CP_LOG_WARNING("Failed to EnumPrinters. Error code: %d",GetLastError());
    }
    // 释放缓冲区
    delete[] buffer;

    return infPath;
}

获取该inf路径后,打开该路径,拷贝inf文件所在的目录到云电脑

二、驱动安装

(一)方式一

打开目录,找到inf后缀的文件,右键选择“安装”。

(二)方式二

打开命令行,用 “pnputil.exe -a inf文件路径" 安装

文章来自个人专栏
深度学习/C++开发
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0