printing - 如何安装pscript/unidrv渲染插件? DDK/WDK print/oemdll 样本表现得很奇怪

标签 printing drivers wdk inf

我正在尝试获取 pscript/unidrv rendering plugins 的内容,但是提供的 DDK 示例无法安装在我拥有的 DDK/构建/目标系统的任何可能组合上。

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

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

  • 更改 .rc 文件以匹配 FILESUBTYPE (VFT2_DRV_VERSIONED_PRINTER) 和 FILETYPE (VFT_DRV)
  • 使用测试证书签名,打开 Debug模式
  • 将空硬件 ID 后跟普通兼容 ID 添加到 .inf 中的产品名称中 ("product 1"= Product_target,,product_1)
  • 检查 .inf 中引用的所有文件(.ini、.gpd、.dll)是否都已就位
  • 删除对除我所需的oems目标之外的任何文件的所有其他引用
  • 运行 chkinf 测试并修复所有警告
  • 搞乱 UAC、文件位置、进行其他印加舞蹈。

还应该做​​什么才能将 pscript 渲染插件安装到系统中?

它们是否应该作为普通设备安装在打印机驱动程序之外? MSDN 对此确实不清楚,但是,根据 DDK 源代码内部 .inf 的存在猜测,我想有一种方法可以“按原样”安装它们,我只是还没有找到。 p>


UPD:在 WDK8 中找到了这些示例的描述(“http://code.msdn.microsoft.com/windowshardware/OEMDLL-Samples-71364d95”),其中提到了主文章(“自定义 Microsoft 打印机驱动程序”)中未找到的内容 - “位图、OEMPS、 OEMUI、OEMUNI、OEMPREAN、CUSTHLP、SyncSet、ThemeUI、PSUIRep 和 Watermark 示例不会影响打印机输出”

最佳答案

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

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

所以我建议您从通用文本示例开始。一旦你构建并安装了它,就可以处理 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);

关于printing - 如何安装pscript/unidrv渲染插件? DDK/WDK print/oemdll 样本表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130332/

相关文章:

java - 我在 java 中遇到问题,无法打印所有 swing 组件

python 2.7 : reload(sys) disables error messages and print in Windows

linux - 控制打印头

C#驱动开发?

boost - 在应用程序的 WDK 构建环境中使用 boost?

windows - 如何使用NDIS筛选器驱动程序读取接收到的数据包?

javascript - JavaFX : Set default printer for WebEngine/Webview

plugins - 从网页静默打印

installation - 创新设置 : install drivers with rundll32 or dpinst?

windows - 添加或扩展windows下的文件系统支持