我正在为 Windows 创建一个 Qt WebEngine 应用程序,它显示一个网页并使用打印机打印出所显示的任何内容。我正在尝试使用 Windows 的 winspool 库和此示例从我的自定义 vkp80III 票证打印机中获取错误状态https://support.microsoft.com/en-us/kb/160129
应用程序有这个打印调用。(printerState 没用,它似乎总是空闲,但无论如何):
void printReceipt() {
if (mDefaultPrinter->printerState() == QPrinter::Error) {
this->printCallback(false);
}
else {
this->print(mDefaultPrinter, [=](bool success) { this->printCallback(success); });
}
}
然后问题来了,打印成功后回调:
void printCallback(bool success){
DWORD size;
bool result = GetDefaultPrinter (NULL, &size);
qDebug() << "LEN: " << size;
LPWSTR pname = (LPWSTR)malloc(size+1);
result = GetDefaultPrinter(pname, &size);
if(!result){
qDebug() << "GetDefaultPrinter err: " << GetLastError();
}
else {
pname[size] = 0;
qDebug() << "PRINTER NAME: " << &pname << ", LEN: " << size;
}
QString name = mDefaultPrinter->printerName();
//These give more or less odd results
//wchar_t* w_str = const_cast<wchar_t*>(name.toStdWString().c_str());
//LPWSTR w_str = (LPWSTR)name.utf16();
/*wchar_t* w_str = (wchar_t*) malloc (sizeof(wchar_t)*name.length()+1);
int len = name.toWCharArray(w_str);
w_str[len]=0;*/
//OpenPrinter example uses LPHANDLE but that didn't work
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS pd;
ZeroMemory(&pd, sizeof(pd));
pd.DesiredAccess = PRINTER_ALL_ACCESS;
qDebug() << "TRYING GET PRINTER: " << name;
if(OpenPrinter(pname, &hPrinter, &pd)) {
qDebug() << "GOT PRINTER ERR STATE: " << IsPrinterError(&hPrinter);
}
free(pname);
emit printReceiptComplete(success);
}
我在 MSDN 示例中放置了几个调试日志,它显示当代码尝试 GetPrinter(hPrinter) 时,它返回 INVALID_HANDLE_ERROR。所以我从来没有得到打印机的错误点。首先我认为这是错误的打印机名称,这就是为什么有不同的代码行获取它/将其转换为 LPWSTR。
那么什么有效:-我得到默认打印机的名称“CUSTOM VKP80III”所以它就在那里-OpenPrinter(&handle)返回true,我得到了句柄
问题 -GetPrinter(handle) 返回 false 并且 GetLastError() 是无效句柄,为什么?