Ошибка недействительного дескриптора API принтера Windows Qt 5.8

Я создаю приложение 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 () является недействительным дескриптором, почему?

0

Решение

Ой, как много косметики прямо сейчас. Это:

IsPrinterError(&hPrinter);

должно быть так:

IsPrinterError(hPrinter);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]