0

我正在为 Windows 创建一个 Qt WebEngine 应用程序,它显示一个网页并使用打印机打印出所显示的任何内容。我正在尝试使用 Windows 的 winspool 库和此示例从我的自定义 vkp80III 票证打印机中获取错误状态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() 是无效句柄,为什么?

4

1 回答 1

0

哦,现在这么多打脸。这个:

IsPrinterError(&hPrinter); 

应该是这样的:

IsPrinterError(hPrinter);
于 2016-10-17T05:28:49.813 回答