gpt4 book ai didi

c++ - 如何将 OpenPrinter 用于网络打印机?

转载 作者:行者123 更新时间:2023-11-28 01:34:29 25 4
gpt4 key购买 nike

我正在尝试通过 OpenPrinter API 在 Windows 10 机器和网络打印机之间建立连接。

目前,OpenPrinter 未返回有效句柄,GetLastError() 返回错误 1801:“打印机名称无效”。

如果我使用连接到机器的本地打印机,则不会发生并且工作正常。

我尝试了几个版本的名称:Windows 控制面板使用的打印机名称、设备名称、IP 等...但都没有成功。

在注册表中只有本地设备可用。我在几个程序中使用网络打印机,我可以 ping 通它。所以,从网络方面来说是可以的。

但是,我对 Windows 打印机 API 了解得越多,我就越感到困惑:

我对这个 API 的基本理解是我使用一个 UNC 名称并将其发布到 OpenPrinter()。然后 OpenPrinter 为我提供了打印机的有效句柄。

在我看来,任何其他事情,比如套接字连接,都可以由 API 完成。也许我完全错了,有人可以启发我。

基本上,截取的已发布代码是 MSDN 提供的示例。

变量LPWSTR printer = 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
}

最佳答案

我认为这是你的问题:

The variable LPWSTR printer = L"\\gisrv44.wekal.de\wkkp04"; is given to LPTSTR szPrinterName.

在C/C++中,字符\在字符串字面量中有特殊用途,可以用来表达其他方式无法表达的字符串,比如\0 , \n, \x48 等等。这意味着如果你想在你的代码中包含一个\,你需要输入两次,所以你需要输入:

LPWSTR printer = L"\\\\gisrv44.wekal.de\\wkkp04";

如果你想让字符串文字变成\\gisrv44.wekal.de\wkkp04

或者,您可以使用 C++11 原始字符串文字语法,例如:

LPWSTR printer = LR"(\\gisrv44.wekal.de\wkkp04)";

有关 C string literals 的更多信息,请参见此处


此外,LPWSTR printer = ... 用于您的打印机 url 表明您使用的是 Unicode 版本的 OpenPrinter(所以 OpenPrinterW) 而 PRINTER_DEFAULTSA 会建议您使用 ASCII 版本。两者都应使用 ASCII(LPCSTRPRINTER_DEFAULTSA)或 Unicode(LPWSTRPRINTER_DEFAULTSW)变体,具体取决于在实际的 OpenPrinter 上定义。

我建议使用 OpenPrinterAOpenPrinterW 使所有 WINAPI 类型和函数明确使用 ASCII 或 Unicode。

例如:

LPCSTR printer = R"(\\gisrv44.wekal.de\wkkp04)";

PRINTER_DEFAULTSA pDefault;
pDefault.DesiredAccess = PRINTER_ACCESS_ADMINISTER;

// Open a handle to the printer.
bStatus = OpenPrinterA(szPrinterName, &hPrinter, &pDefault);

关于c++ - 如何将 OpenPrinter 用于网络打印机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49938151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com