Как установить плагины рендеринга pscript / unidrv? Образцы DDK / WDK print / oemdll ведут себя странно

Я пытаюсь получить что-то вроде плагины рендеринга pscript / unidrv, но предоставленные образцы DDK просто не могут быть установлены ни в одной из возможных комбинаций DDK / build / target системы, которые у меня когда-либо были.

Сообщается следующее сообщение: «Указанный порт неизвестен» для WinXP x64 и «Элемент не найден» для Win7, Win8 (часть журнала setupapi Win7 с замечательным "dvi: установка драйвера NULL не разрешена для этого типа устройства. ! "ошибку можно найти здесь).

До сих пор я пытался:

  • измените файл .rc на соответствие FILESUBTYPE (VFT2_DRV_VERSIONED_PRINTER) и FILETYPE (VFT_DRV)
  • подписать с помощью тестового сертификата, включить режим отладки
  • добавить пустой hw-id, за которым следует обычный совместимый идентификатор, к названиям продуктов в .inf ("product 1" = product_target,,product_1)
  • проверил, что все файлы, указанные в .inf (.ini, .gpd, .dll), находятся на своих местах
  • удалить все дополнительные ссылки на любые файлы, кроме моей желаемой цели oemps
  • запустить тесты chkinf и исправить все предупреждения
  • возиться с UAC, расположением файлов, танцевать другой танец инков.

Что еще нужно сделать, чтобы в систему был установлен плагин рендеринга pscript?

Предназначены ли они когда-либо для установки как обычное устройство без драйверов принтера? В MSDN это действительно неясно, но, судя по наличию .inf внутри исходных кодов DDK, я полагаю, что есть способ установить их «как есть», я просто не нашел его ... пока.


UPD: нашел описание этих образцов в WDK8 ("http://code.msdn.microsoft.com/windowshardware/OEMDLL-Samples-71364d95 "), в котором упоминается кое-что, чего нет в основной статье (" Настройка драйверов принтеров Microsoft ") - " BITMAP, OEMPS, OEMUI, Примеры OEMUNI, OEMPREAN, CUSTHLP, SyncSet, ThemeUI, PSUIRep и Watermark не влияют на вывод на принтер ".


person kagali-san    schedule 28.02.2013    source источник
comment
Примеры WDK, безусловно, можно установить, но в них довольно мало того, как это сделать. Опубликуйте файл .INF, который вы пытаетесь использовать, и я уверен, что мы сможем заставить его работать. Что касается вашего последнего вопроса, я не совсем понимаю, о чем вы спрашиваете. Плагины pscript / unidrv - это именно плагины для базовых драйверов Microsoft pscript / unidrv. Они сами по себе не являются полными драйверами печати.   -  person Carey Gregory    schedule 28.02.2013
comment
@CareyGregory, учитывая, что MSDN `` нацелен '' на выбранную аудиторию (например, вы ожидаете, что кто-то будет писать драйвер оборудования принтера, а не выходной фильтр программного обеспечения для печати) - можно предположить, что я ужасно ошибаюсь в том, что эти драйверы являются возможность установки .. подробнее в посте обновления. Однако вот .inf, everfall.com/paste/id.php?ougcmg89jpaq - буду рад, если дадите идею по переключению способа установки.   -  person kagali-san    schedule 28.02.2013


Ответы (1)


Цитата, которую вы цитируете относительно BITMAP, OEMPS и т. Д., Просто означает, что эти образцы только показывают структуру плагина драйвера и не производят никакого вывода. Но это не значит, что они не могут. Если вы хотите создать плагин драйвера, я бы порекомендовал вам начать с одного из этих примеров и добавить к нему код, который делает то, что вы хотите.

Установка драйверов печати может быть сложной задачей, поскольку мастер установки принтера предоставляет очень плохие отчеты об ошибках. Все, что это дает вам, - это код ошибки Win32. Например, если какие-либо необходимые файлы отсутствуют, он просто покажет вам код ошибки 0x2, что означает отсутствие файла. Однако он не сообщит вам, какой файл отсутствует, что может сильно расстраивать. Но будьте уверены, эти образцы можно установить. Как правило, вам необходимо, чтобы все файлы, перечисленные в файле .inf, находились в одном каталоге с файлом .inf. В большинстве случаев это одна или две библиотеки DLL, а также файлы .ini и .gpd или .ppd. Я, например, только что собрал и установил универсальный текстовый драйвер. Я также нашел хорошее руководство по установке этого драйвера здесь.

Поэтому я бы порекомендовал вам начать с образца общего текста. После того, как вы его собрали и установили, займитесь драйвером pscript. Не изменяйте предоставленный ими файл .inf и не возитесь с файлом .rc или сертификатами; вам не нужен сертификат.

Альтернативой использованию мастера добавления принтера является установка драйвера напрямую с помощью AddPrinterDriver и AddPrinter. Это более сложно, но я предпочитаю его, потому что он дает вам больше контроля и вы можете точно видеть, какие ошибки происходят и почему. Файл .inf не требуется. Ниже приведен фрагмент рабочего кода, который устанавливает драйвер и создает принтер, используя этот драйвер. Для наглядности убрана проверка ошибок и копирование файлов ....

char driverPath[MAX_PATH];
DWORD needed;
GetPrinterDriverDirectory(0, 0, 1, (UCHAR *)driverPath, sizeof(driverPath), &needed);

// **copy all necessary files to driverPath here**

// format all file names with full paths
char driverSrc[MAX_PATH];
sprintf_s(driverSrc, "%s\\%s", driverPath, psDriverFile);
char driverUISrc[MAX_PATH];
sprintf_s(driverUISrc, "%s\\%s", driverPath, psUIFile);
char driverPPDSrc[MAX_PATH];
sprintf_s(driverPPDSrc, "%s\\%s", driverPath, psPPDFile);
char helpFileSrc[MAX_PATH];
sprintf_s(helpFileSrc, "%s\\%s", driverPath, psHelpFile);

// initialize the DRIVER_INFO struct
DRIVER_INFO_3 di;
memset(&di, 0, sizeof(di));
di.cVersion = 3;
di.pEnvironment = "Windows x64";
di.pDriverPath = driverPath;
di.pName = "MyDriver";
di.pDefaultDataType = "RAW";
di.pDataFile = driverPPDSrc;
di.pConfigFile = driverUISrc;
di.pHelpFile = helpFileSrc;
di.pDependentFiles = pszDependentFiles;

// add the driver
AddPrinterDriver(0, 3, (LPBYTE)&di);

// create the printer
PRINTER_INFO_2 pi;
memset(&pi, 0, sizeof(pi));
pi.pPrinterName = (LPSTR)pPrinterNames->at(i);
pi.pDriverName = "MyDriver";
pi.pPrintProcessor = "winprint";
pi.Attributes = PRINTER_ATTRIBUTE_LOCAL;
pi.pDatatype = "RAW";
pi.pPortName = "LPT1:";
HANDLE hPrinter = AddPrinter(0, 2, (LPBYTE)&pi);
person Carey Gregory    schedule 28.02.2013