2

我正在尝试获得一些pscript/unidrv 渲染插件,但提供的 DDK 示例无法安装在我曾经拥有的任何可能的 DDK/build/target 系统组合上。

报告的消息是 WinXP x64 的“指定端口未知”和 Win7、Win8 的“未找到元素”(Win7 setupapi 日志的一部分,带有显着的“dvi:此类设备不允许安装 NULL 驱动程序! ”错误可以在这里找到)。

到目前为止,我已经尝试过:

  • 更改 .rc 文件以匹配 FILESUBTYPE ( VFT2_DRV_VERSIONED_PRINTER) 和 FILETYPE ( VFT_DRV)
  • 使用测试证书签名,打开调试模式
  • "product 1" = product_target,,product_1在 .inf ( )中的产品名称中添加空的 hw-id 后跟普通的 compatible-id
  • 检查 .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 和水印样本不影响打印机输出”

4

1 回答 1

3

您引用的有关 BITMAP、OEMPS 等的引用仅表示这些示例仅显示驱动程序插件的结构,不产生任何输出。但这并不意味着他们不能。如果您想构建驱动程序插件,我建议您从其中一个示例开始,然后向其中添加代码以执行您想要的操作。

安装打印驱动程序可能很棘手,因为“添加打印机向导”提供的错误报告非常差。它给你的只是一个 Win32 错误代码。例如,如果缺少任何必需的文件,它只会显示错误代码 0x2,这意味着缺少文件。但是,它不会告诉您缺少哪个文件,这可能会非常令人沮丧。但请放心,这些样本可以安装。通常,您需要将 .inf 文件中列出的所有文件与 .inf 文件放在同一目录中。在大多数情况下,这将是一个或两个 DLL,加上一个 .ini 和一个 .gpd 或 .ppd 文件。例如,我刚刚构建并安装了通用文本驱动程序。我还在这里找到了关于安装该驱动程序的好教程。

因此,我建议您从通用文本示例开始。构建和安装它后,请处理 pscript 驱动程序。不要更改他们提供的 .inf 文件,也不要摆弄 .rc 文件或证书;你不需要证书。

使用添加打印机向导的替代方法是使用AddPrinterDriverAddPrinter函数直接安装驱动程序。这更复杂,但我更喜欢它,因为它给了你更多的控制权,你可以准确地看到发生了什么错误以及原因。不需要 .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);
于 2013-02-28T20:59:29.580 回答