2010-07-01 1 views
3

Я написал драйвер принтера, который работает в системах под управлением x86 и x64 MS Windows. Я также написал программу, которая устанавливает драйвер принтера с помощью функций AddPrinterDriver и AddPrinter.Как добавить дополнительные драйверы принтера (x86/x64) программно под Windows XP, 2003,7,2008

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

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

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

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

ответ

2

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

При установке драйвера также скопируйте права на файлы архитектуры на другие архитектуры. x86 драйвер для xool spooler driver dir, x64-x64 драйвер диспетчера очереди буферов и т. д.

Затем перед вызовом AddPrinterDriver и AddPrinter вы должны добавить несколько значений реестра для каждой другой архитектуры, которую вы хотите поддерживать. Затем вызовите AddPrinterDriver и AddPrinter только для базовой архитектуры os, в которую вы устанавливаете свой драйвер.

Значения реестра должны быть добавлены к

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} должны совпадать с именем drivername, которое вы используете для 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); 
Смежные вопросы