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

Я создаю приложение Qt WebEngine для Windows, которое отображает веб-страницу и использует принтер для печати того, что отображается. Я пытаюсь вывести состояние ошибки из моего пользовательского принтера билетов 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(&handle) возвращает true, и я получаю дескриптор

Проблема -GetPrinter(handle) возвращает false, а GetLastError() является недействительным дескриптором, почему?

1 ответ

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

IsPrinterError(&hPrinter); 

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

IsPrinterError(hPrinter);
Другие вопросы по тегам