2012-10-19 13 views
5

Ich möchte überprüfen, ob der Drucker online ist. Dafür bekomme ich den Druckerhandle mit OpenPrinter. Dann möchte ich PRINTER_STATUS_OFFLINE in PRINTER_INFO_6 mit GetPrinter() verwenden. Das Ergebnis ist immer 0?Überprüfen, ob der installierte Netzwerkdrucker online ist

Wie erhalte ich den Offline-Status meines Druckers?

Code ich verwendet.

bool IsPrinterOnline(wstring strPrinterFriendlyName) 
{ 
    HANDLE hPrinter ; 
    if (OpenPrinter(const_cast<LPWSTR>(strPrinterFriendlyName.c_str()), &hPrinter, NULL) == 0) 
    {  
    /*OpenPrinter call failed*/ 
    return false; 
    } 

    DWORD dwBufsize = 0; 
    PRINTER_INFO_6* pinfo = 0; 
    GetPrinter(hPrinter, 6,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize 

    PRINTER_INFO_6* pinfo6 = (PRINTER_INFO_6*)malloc(dwBufsize); //Allocate with dwBufsize 
    GetPrinter(hPrinter, 6,(LPBYTE)pinfo6, dwBufsize, &dwBufsize); 

    DWORD dwStatus = pinfo6->dwStatus; //always returns 0 

    if (dwStatus == PRINTER_STATUS_OFFLINE) 
    { 
    free(pinfo6); 
    ClosePrinter(hPrinter); 
    return false; 
    } 

    free(pinfo6); 
    ClosePrinter(hPrinter); 
    return true; 
} 
+0

Sind beide GetPrinter tatsächlich erfolgreich? – Jay

+0

Zweiter GetPrinter war erfolgreich (gab nicht-null zurück). Aber der Status ist immer Null. –

Antwort

6

Ich reparierte es. Ich habe "pinfo2-> Attribute & PRINTER_ATTRIBUTE_WORK_OFFLINE" verwendet.

Hier ist der Code.

bool IsPrinterOnline(wstring strPrinterFriendlyName) 
{ 
    HANDLE hPrinter ; 
    if (OpenPrinter(const_cast<LPWSTR>(strPrinterFriendlyName.c_str()), &hPrinter, NULL) == 0) 
    {  
    /*OpenPrinter call failed*/ 
    return false; 
    } 

    DWORD dwBufsize = 0; 
    PRINTER_INFO_2* pinfo = 0; 
    int nRet = 0; 
    nRet = GetPrinter(hPrinter, 2,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize 
    DWORD dwGetPrinter = 0; 
    if (nRet == 0) 
    { 
    dwGetPrinter = GetLastError(); 
    } 

    PRINTER_INFO_2* pinfo2 = (PRINTER_INFO_2*)malloc(dwBufsize); //Allocate with dwBufsize 
    nRet = GetPrinter(hPrinter, 2,reinterpret_cast<LPBYTE>(pinfo2), dwBufsize, &dwBufsize); 
    if (nRet == 0) 
    { 
    dwGetPrinter = GetLastError(); 
    return false; 
    } 

    if (pinfo2->Attributes & PRINTER_ATTRIBUTE_WORK_OFFLINE) 
    { 
    free(pinfo2); 
    ClosePrinter(hPrinter); 
    return false; 
    } 

    free(pinfo2); 
    ClosePrinter(hPrinter); 
    return true; 
} 
+0

Nicht korrekt, zumindest für Netzwerkdrucker. –

+0

@CristianAmarie: kannst du bitte deinen Kommentar erklären? – Thalia

+0

Ein Netzwerkdrucker kann als online gemeldet werden, während das physische Gerät tatsächlich offline ist. Ich sage nicht, ist immer wahr, aber das passiert. Auch das Gegenteil ist passiert: Netzwerkdrucker berichtet auf meinem Computer als offline (was falsch war), und ich konnte nichts drucken. Ich habe einen Kollegen gebeten, etwas zu drucken und voila - der Drucker hat seinen Status zurück auf online aktualisiert. Wahrscheinlich gibt es eine Unstimmigkeit zwischen dem Spooler und dem Netzwerklistenmanager/UPnP/welcher Mechanismus auch immer Win32 verwendet. –