Qt 5.8 windows打印机api无效句柄错误

Qt 5.8 windows printer api invalid handle error

本文关键字:无效 句柄 错误 api 打印机 windows Qt      更新时间:2023-10-16

我正在为Windows创建一个Qt WebEngine应用程序,该应用程序显示网页并使用打印机打印出显示的任何内容。我正在尝试使用windows的winspool库和此示例https://support.microsoft.com/en-us/kb/160129从我的自定义vkp80III票据打印机中获得错误状态

App有这个打印调用。(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()是无效句柄,为什么?

哦,现在太多的捂脸了。:

IsPrinterError(&hPrinter); 

应该是这样的:

IsPrinterError(hPrinter);