Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows XP下以编程方式添加其他打印机驱动程序(x86/x64),2003,72008_Windows_Printing - Fatal编程技术网

如何在Windows XP下以编程方式添加其他打印机驱动程序(x86/x64),2003,72008

如何在Windows XP下以编程方式添加其他打印机驱动程序(x86/x64),2003,72008,windows,printing,Windows,Printing,我已经编写了一个打印机驱动程序,它可以在x86和x64 MS Windows系统下工作。我还编写了一个安装程序,通过AddPrinterDriver和AddPrinter函数安装打印机驱动程序 到目前为止,一切顺利。问题是,如果我想将这台打印机从x64系统共享到x86系统,x64打印服务器需要安装用于x86系统的其他驱动程序 现在,我可以通过“打印机属性”->“共享”->“其他驱动程序”安装其他驱动程序,并选择适当的.inf文件,但我想通过安装程序来完成 有人知道如何做到这一点吗 谢谢你的帮助

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

到目前为止,一切顺利。问题是,如果我想将这台打印机从x64系统共享到x86系统,x64打印服务器需要安装用于x86系统的其他驱动程序

现在,我可以通过“打印机属性”->“共享”->“其他驱动程序”安装其他驱动程序,并选择适当的.inf文件,但我想通过安装程序来完成

有人知道如何做到这一点吗


谢谢你的帮助

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

安装驱动程序时,还要将正确的体系结构文件复制到其他体系结构。x86驱动程序到x86后台处理程序驱动程序目录、x64到x64后台处理程序驱动程序目录等

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

必须将注册表值添加到

SYSTEM\CurrentControlSet\Control\Print\Environments\{TARGET\u Environment}\Drivers\Version-3\{NAME\u OF_YOUR\u DRIVER}

其中{TARGET_environment}是您想要支持的另一个环境,例如“WindowsNTx86”;“Windows x64”;“Windows IA64”和{您的驱动程序的名称}必须与您用于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);