2016-10-14 9 views
0

Webページを表示し、プリンタを使用して表示されているものを印刷するQt WebEngineアプリケーションをWindows用に作成しています。 Windowsのwinspoolライブラリとこの例を使用してカスタムvkp80IIIチケットプリンタからエラー状態を取得しようとしていますhttps://support.microsoft.com/en-us/kb/160129Qt 5.8 windows printer apiが無効なハンドルエラー

アプリケーションがこのプリントコールを持っています。 (printerStateは無用である、常にアイドル状態のようですが、とにかく):

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

をそして正常に開始し、印刷後の問題、コールバック来る:私はMSDNの例内のデバッグログのカップルを置く

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

をコードがGetPrinter(hPrinter)にしようとすると、INVALID_HANDLE_ERRORを返します。だから私は、プリンタのエラーを取得することを指摘することはありません。最初は間違ったプリンタ名だと思っていたので、LPWSTRに変換するコードの行が異なっています。

だから何が機能: -I GETデフォルトプリンタ名 "CUSTOM VKP80IIIを" それはそこ -OpenPrinter(&ハンドル)がtrueを返すと私はハンドル

問題 -GetPrinter(ハンドル)がfalseを返す取得されるように、 GetLastError()は無効なハンドルです、なぜですか?

答えて

0

今、あまりにも多くの顔を叩く。この:

IsPrinterError(&hPrinter); 

はこのようになります。

IsPrinterError(hPrinter); 
関連する問題