【问题标题】:How to add additional printer drivers (x86/x64) programmatically under Windows XP,2003,7,2008如何在 Windows XP、2003、7、2008 下以编程方式添加其他打印机驱动程序 (x86/x64)
【发布时间】:2010-07-01 14:11:18
【问题描述】:

我编写了一个在 x86 和 x64 MS Windows 系统下工作的打印机驱动程序。我还编写了一个安装程序,通过 AddPrinterDriver 和 AddPrinter 函数安装打印机驱动程序。

到目前为止,一切都很好。问题是,如果我想将这台打印机从 x64 系统共享到 x86 系统,x64 打印服务器需要为 x86 系统安装额外的驱动程序。

现在我可以通过“打印机属性”->“共享”->“附加驱动程序”安装附加驱动程序并选择正确的 .inf 文件,但我想通过我的安装程序来安装。

有人知道怎么做吗?

感谢您的帮助!

【问题讨论】:

    标签: windows printing


    【解决方案1】:

    所以我自己找到了解决方案。一定有更好更简单的方法,但效果很好。

    在安装驱动程序时,还要将正确的架构文件复制到其他架构。 x86 驱动程序到 x86 spooler 驱动程序目录,x64 到 x64 spooler 驱动程序目录等。

    然后在调用 AddPrinterDriver 和 AddPrinter 之前,您必须为要支持的其他体系结构添加一些注册表值。然后仅为您安装驱动程序的操作系统的基本架构调用 AddPrinterDriver 和 AddPrinter。

    注册表值必须添加到

    SYSTEM\CurrentControlSet\Control\Print\Environments\{TARGET_ENVIROMENT}\Drivers\Version-3\{NAME_OF_YOUR_DRIVER}

    其中 {TARGET_ENVIROMENT} 是您要支持的其他环境,例如"Windows NT x86"; "Windows x64"; “Windows IA64”和 {NAME_OF_YOUR_DRIVER} 必须与您用于 AddPrinterDriver 的驱动程序名称匹配。您必须添加的值是 AddPrinterDriver 将添加到您的系统环境中的值的副本。您可以在下面的代码示例中详细查看它们。之后,只需为系统架构调用 AddPrinterDriver 和 AddPrinter,其他驱动程序也会出现。

    在 Win32 中,您可以使用以下命令在 x64 系统上安装 x86 和 x64 的驱动程序(此示例不进行错误检查):

        DWORD uSize;
        BYTE driver_dir_x86[MAX_PATH];
        BYTE driver_dir_x64[MAX_PATH];
    
        GetPrinterDriverDirectory(NULL,"Windows NT x86",1,driver_dir_x86,MAX_PATH,&uSize);
        GetPrinterDriverDirectory(NULL,"Windows x64",1,driver_dir_x64,MAX_PATH,&uSize);
    
    
        CopyFile(".\x86\printer_driver.dll",driver_dir_x86);
        CopyFile(".\x86\PRINTER.PPD",driver_dir_x86);
        CopyFile(".\x86\PRINTERUI.DLL",driver_dir_x86);
        CopyFile(".\x86\PRINTER.HLP",driver_dir_x86);
    
        CopyFile(".\x64\printer_driver.dll",driver_dir_x64);
        CopyFile(".\x86\PRINTER.PPD",driver_dir_x64);
        CopyFile(".\x86\PRINTERUI.DLL",driver_dir_x64);
        CopyFile(".\x86\PRINTER.HLP",driver_dir_x64);
    
        //Insert x86 additional drivers to registry
       RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Print\\Environments\\Windows NT x86\\Drivers\\Version-3\\", 0, KEY_ALL_ACCESS, &hkey);
       RegCreateKey(hkey, "My_Printer_Drivername", &hsubkey);       {
       RegSetValueEx(hsubkey, "Dependent Files", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "Previous Names", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "ColorProfiles", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "CoreDependencies", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
       DWORD Val = 3;
       RegSetValueEx(hsubkey, "Version", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
       Val = 0;
       RegSetValueEx(hsubkey, "TempDir", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
       Val = 2;
       RegSetValueEx(hsubkey, "Attributes", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
       Val = 0;
       RegSetValueEx(hsubkey, "PrinterDriverAttributes", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
       RegSetValueEx(hsubkey, "Configuration File", 0, REG_SZ, (BYTE*)"PRINTERUI.DLL", lstrlen("PRINTERUI.DLL")+1);
       RegSetValueEx(hsubkey, "Data File", 0, REG_SZ, (BYTE*)"PRINTER.PPD", lstrlen("PRINTER.PPD")+1);
       RegSetValueEx(hsubkey, "Driver", 0, REG_SZ, (BYTE*)"printer_driver.dll", lstrlen("printer_driver.dll")+1);
       RegSetValueEx(hsubkey, "Help File", 0, REG_SZ, (BYTE*)"PRINTER.HLP", lstrlen("PRINTER.HLP")+1);
       RegSetValueEx(hsubkey, "Monitor", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "Datatype", 0, REG_SZ, (BYTE*)"RAW", lstrlen("RAW")+1);
       RegSetValueEx(hsubkey, "Manufacturer", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "OEM URL", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "HardwareID", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "Provider", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "Print Processor", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "VendorSetup", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "InfPath", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
       RegSetValueEx(hsubkey, "DriverDate", 0, REG_SZ, (BYTE*)"01/01/2010", lstrlen("01/01/2010")+1);
       RegSetValueEx(hsubkey, "DriverVersion", 0, REG_SZ, (BYTE*)"1.0.0.0", lstrlen("1.0.0.0")+1);
       RegSetValueEx(hsubkey, "MinInboxDriverVerDate", 0, REG_SZ, (BYTE*)"01/01/2010", lstrlen("01/01/2010")+1);
       RegSetValueEx(hsubkey, "MinInboxDriverVerVersion", 0, REG_SZ, (BYTE*)"1.0.0.0", lstrlen("1.0.0.0")+1);
       RegCloseKey(hsubkey);
       RegCloseKey(hkey);
    
       //Add x64 printer driver
       DRIVER_INFO_3 di3;
       ZeroMemory(&di3, sizeof(DRIVER_INFO_3)); 
       di3.cVersion = 0x03; 
       di3.pConfigFile = "PRINTERUI.DLL"; 
       di3.pDataFile = "PRINTER.PPD";       
       di3.pDependentFiles = "";
       di3.pDriverPath = "printer_driver.dll"; 
       di3.pEnvironment = "Windows x64";
       di3.pHelpFile = "PRINTER.HLP";
       di3.pMonitorName = NULL; 
       di3.pName = "My_Printer_Drivername";
       di3.pDefaultDataType = TEXT("RAW");
       AddPrinterDriver(NULL, 3, (LPBYTE)&di3);
    

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多