您引用的有关 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);