Я создаю приложение Qt WebEngine для Windows, которое отображает веб-страницу и использует принтер для печати того, что отображается. Я пытаюсь вывести состояние ошибки из моего принтера билетов Custom vkp80III, используя библиотеку winspool в Windows и этот пример 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 (&обрабатывать) возвращает истину, и я получаю ручку
проблема
-GetPrinter (handle) возвращает false, а GetLastError () является недействительным дескриптором, почему?
Ой, как много косметики прямо сейчас. Это:
IsPrinterError(&hPrinter);
должно быть так:
IsPrinterError(hPrinter);
Других решений пока нет …