Как программно добавить дополнительные драйверы принтера (x86 / x64) под Windows XP, 2003,7,2008 - PullRequest
3 голосов
/ 01 июля 2010

Я написал драйвер принтера, который работает в системах x86 и x64 MS Windows. Я также написал настройку, которая устанавливает драйвер принтера через функции AddPrinterDriver и AddPrinter.

Пока все хорошо. Дело в том, что если я хочу использовать этот принтер из системы x64 в системе x86, на сервере печати x64 должны быть установлены дополнительные драйверы для систем x86.

Теперь я могу просто установить дополнительные драйверы через «Свойства принтера» -> «Общий доступ» -> «Дополнительные драйверы» и выбрать нужный файл .inf, но я хочу сделать это через программу установки.

Кто-нибудь знает, как этого добиться?

Спасибо за помощь!

1 Ответ

2 голосов
/ 06 июля 2010

Так что я сам нашел решение.Должен быть лучший и более простой способ, но он хорошо работает.

При установке драйвера также скопируйте нужные файлы архитектуры в другие архитектуры.Драйвер x86 в каталог драйвера диспетчера очереди x86, каталог драйвера диспетчера очереди x64 - x64 и т. д.

Затем перед вызовом 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 вы можете использовать следующее для установки драйверов для x86 и x64 в системе 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...