2016-10-14 2 views
0

Ich erstelle eine Qt WebEngine-Anwendung für Windows, die eine Webseite anzeigt und einen Drucker verwendet, um das auszudrucken, was angezeigt wird. Ich versuche, einen Fehlerstatus aus meinem Custom vkp80III-Ticketdrucker mit Winspool-Bibliothek von Windows zu erhalten und dieses Beispiel https://support.microsoft.com/en-us/kb/160129Qt 5.8 Windows-Drucker api ungültiger Handle Fehler

App hat diesen Druckanruf. (PrinterState nutzlos ist, scheint es immer untätig zu sein, aber sowieso):

void printReceipt() { 
    if (mDefaultPrinter->printerState() == QPrinter::Error) { 
     this->printCallback(false); 
    } 
    else { 
     this->print(mDefaultPrinter, [=](bool success) { this->printCallback(success); }); 
    } 
} 

Und dann kommt das Problem, Rückruf nach Druck erfolgreich gestartet:

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); 
} 

ich paar Debug setzen Protokolle innerhalb MSDN Beispiel und es zeigt, dass wenn Code versucht, GetPrinter (hPrinter) gibt es INVALID_HANDLE_ERROR zurück. So bekomme ich nie die Fehler des Druckers zu bekommen. Zuerst dachte ich, dass es der falsche Druckername ist, deshalb gibt es verschiedene Codezeilen, die es in LPWSTR konvertieren.

So was funktioniert: -I Standarddruckernamen "CUSTOM VKP80III" zu erhalten, so ist es dort -OpenPrinter (& Griff) gibt true zurück, und ich bekomme den Griff

Problem -GetPrinter (Handle) gibt false zurück und GetLastError() ist ungültig handle, warum?

Antwort

0

Oh so viel Facepalming gerade jetzt. Dies:

IsPrinterError(&hPrinter); 

sollte dies sein:

IsPrinterError(hPrinter); 
Verwandte Themen