如何将OpenPrinter用于网络打印机?
How to use OpenPrinter for a network printer?
我正在尝试通过OpenPrinter API在Windows 10机器和网络打印机之间建立连接。
目前,OpenPrinter 不会返回有效的句柄,并且 GetLastError() 返回错误 1801:"打印机名称无效"。
如果我使用连接到机器的本地打印机,则不会发生并且工作正常。
我已经尝试了该名称的多个版本:Windows控制面板使用的打印机名称,设备名称,IP等,...但没有成功。
在注册表中,只有本地设备可用。我在几个程序中使用网络打印机,我可以ping它。所以,从网络方面来看是可以的。
但是,我对Windows打印机API的了解越多,我就越感到困惑:
我对这个 API 的基本理解是我使用 UNC 名称并将其发布到 OpenPrinter()。然后OpenPrinter给了我一个有效的打印机句柄。
从我的角度来看,其他任何事情,如套接字连接,都将由 API 完成。也许我完全错了,有人可以启发我。
基本上,截取的已发布代码是MSDN提供的示例。
变量 LPWSTR 打印机 = L"\\\\\gisrv44.wekal.de\wkkp04";被赋予 LPTSTR szPrinterName。
BOOL RawDataToPrinter(LPTSTR szPrinterName, LPBYTE lpData, DWORD dwCount)
{
BOOL bStatus = FALSE;
HANDLE hPrinter = NULL;
DOC_INFO_1 DocInfo;
DWORD dwJob = 0L;
DWORD dwBytesWritten = 0L;
DWORD dwError = 0;
PRINTER_DEFAULTSA *pDefault = new PRINTER_DEFAULTSA();
pDefault->DesiredAccess = PRINTER_ACCESS_ADMINISTER;
PRINTER_OPTIONSA *pOptions = new PRINTER_OPTIONSA();
pOptions->dwFlags = PRINTER_OPTION_NO_CACHE;
// Open a handle to the printer.
bStatus = OpenPrinter(szPrinterName, &hPrinter, pDefault);
if (!bStatus)
{
dwError = GetLastError();
cout << dwError << endl;
}
.....etc
}
我认为这是你的问题:
给定变量 LPWSTR 打印机 = L"\\gisrv44.wekal.de\wkkp04"; 到 LPTSTR szPrinterName。
在 C/C++ 中,字符在字符串文本中具有特殊用途,可用于表示否则无法表达的字符串,例如